函数对象(Function Object)
Dliang 发表于14:10:14 2006-08-25函数对象是使用函数的另一个选择,它可以完成一些函数完成不了的工作。
任何事物只要它完成工作时像一个函数,那么就可以叫函数了。你可以像使用函数一样使用对象。
我们定义一个对象X,并为其定义一个“()”操作符。
class X {
public:
//define "function call" operator
return-value operator() (arguments) const;
...
};
我们可以像使用函数一样使用它。
X fo;
fo(arg1, arg2); //call operator () for function object fo
看下面的例子:
//simple function object that prints the passed argument
#include
#include
#include
using namespace std;
class PrintInt {
public:
void operator() (int elem) const {
cout << elem << ' ';
}
};
int main()
{
vector
//insert elements from 1 to 9
for (int i=1; i<=9; ++i) {
coll.push_back(i);
}
//print all elements
for_each (coll.begin(), coll.end(), //range
PrintInt()); //operation
cout << endl;
}
程序先建立一个PrintInt的临时对象,把它当作参数传送给for_each。for_each的代码如下:
namespace std {
template
Operation for_each (Iterator act, Iterator end, Operation op)
{
while (act != end) { //as long as not reached the end
op (*act); // - call op() for actual element
act++; // - move iterator to the next element
}
return op;
}
}
for_each使用这个临时变量来对每一个*act调用op(*act)操作。如果for_each的第三个参数是一个函数,它会直接使用它,如果第三个参数是一个函数对象,那么它就将*act作为调用这个对象的“()”操作符的参数。这就等于使用下面的方法:
PrintInt::operator()(*act)
函数对象在表面上很复杂,难以理解。但是它有一些优点:
1、函数对象是一种“聪明的函数”(smart functions),我们可以利用它除了“()”操作符以外更多的功能。比如,它可以有自己的成员函数和成员变量,利用这一点我们可以让同一个函数对象在不同的时候有不同的行为,我们也可以在使用它之前对它进行初始化。
2、传统的函数只能使用不同的名字来提供对不同类型参数的处理。但是,函数对象可以用相同的名字来提供对不同类型对象的处理。这也是泛型编程的特点。所以,我们使用同样的函数对象,为其初始化为不同的类型,就可以把它当作算法的操作函数使用了。例如,我们要为不同类型的容器提供排序算法,编写一个支持不同类型容器的函数对象就可以了。
3、函数对象被编译器更好地优化了,因此使用它会带来效率的提升。


0 条评论: