请输入您要查询的百科知识:

 

词条 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条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/2/15 10:53:20