function object

王朝百科·作者佚名  2011-02-16
窄屏简体版  字體: |||超大  

函数对象,形式上是经一个类实例化的对象,本质上是为了实现某种与函数等价的功能。函数对象的思想是:用类来封装一个函数功能,然后用这个类实例化不同的函数对象。

函数对象的使用场合在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的编程人员来说,已经算是一件盛事!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航