词条 | function object |
释义 | 函数对象,形式上是经一个类实例化的对象,本质上是为了实现某种与函数等价的功能。函数对象的思想是:用类来封装一个函数功能,然后用这个类实例化不同的函数对象。 函数对象的使用场合在STL中比较常见。不知你用STL用得多不多,STL里面用到非常多的函数对象。比如:std::map,它是一个模板类,实际使用时需要三个数据类型去替代其中的三个模板,从而使std::map<arg0,arg1,arg2>成为一个真正的类。其中第三个参数arg2就是一个函数对象,STL默认的是std::less(一个STL已经定义好的能够实现比较功能的函数对象)。std::less本身也是一个模板形式的函数对象,它能对全部基本数据类型以及STL中定义的类型的值进行比较,从而通过arg0(关键字)决定std::map中元素的排序。 *****实际使用时,多数人为图方便,一般这样用std::map,即: class AnyClass; std::map <int,AnyClass> mapOfAnyClass; 这个mapOfA能实现动态数组功能,不过这个数组存储的元素是:始终按mapOfA.first(int类型)排好序的mapOfA.second(AnyClass的对象)集合。 ***** *****其实arg0(排序关键字)不一定非得是一般类型(int之类的),也可以是自己定义的struct MyStruct;或者class MyClass {public: int key1; float key2; }; 因为std::map需要对关键字排序,而它默认用函数对象std::less去实现,假如用新的类型myClass做关键字,std::map无法对其中的元素进行排序。怎么办? ***** *****另外自定义一个函数对象,替代std::less,定义如下: class CompairMyClass { public: bool operator()(MyClass par1, MyClass par2) { if(par1.key1 < par2.key1 && par1.key2 < par2.key2 ) { return true; } else { return false; } };//class CompairMyClass 接着就可以用这么一种新map了: std::map <MyClass,AnyClass,CompairMyClass> mapOfMyOwn; 这种map有什么神奇之处呢?它能实现对双关键字(一个整数关键字,一个小数关键字)的排序数组,而原先的std::map是无法实现该功能的,这就相当于升级了STL。而其中的大功臣就是函数对象CompairMyClass。】 ***** *****函数对象主要是为了使STL支持一些自定义的类,其它场合很少用到函数对象,据我所知。这对热衷STL的编程人员来说,已经算是一件盛事! |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。