荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Dreamer (我与萤火虫), 信区: SoftDev
标  题: 【C++】[FAQ]什么是function object?
发信站: 荔园晨风BBS站 (Fri Jun 11 12:32:01 2004), 站内信件


Q: 什么是function object?
A: Function object是一个对象,不过它的行为表现像函数。一般而言,它是由一
个重载了operator()的类所实例化得来的对象。
Function object的涵义比通常意义上的函数更广泛,因为它可以在多次调用之间
保持某种“状态”——这和静态局部变量有异曲同工之妙;不过这种“状态”还可
以被初始化,还可以从外面来检测,这可要比静态局部变量强了。我们来看一个例
子:

class Sum {
int val;
public:
Sum(int i) :val(i) { }
operator int() const { return val; } // extract value

int operator()(int i) { return val+=i; } // application
};

void f(vector v)
{
Sum s = 0; // initial value 0
s = for_each(v.begin(), v.end(), s); // gather the sum of all elements
cout << "the sum is " << s << "\n";

// or even:
cout << "the sum is " << for_each(v.begin(), v.end(), Sum(0)) << "\n";
}


这里我要提请大家注意:一个function object可被漂亮地内联化(inlining),因
为对于编译器而言,没有讨厌的指针来混淆视听,所以这样的优化很容易进行。[
译注:这指的是将operator()定义为内联函数,可以带来效率的提高。] 作为对比
,编译器几乎不可能通过优化将“通过函数指针调用函数”这一步骤所花的开销省
掉,至少目前如此。
在标准库中function objects被广泛使用,这给标准库带来了极大的灵活性和可扩
展性。

[译注:C++是一个博采众长的语言,function object的概念就是从functional
programming中借来的;而C++本身的强大和表现力的丰富也使这种“拿来主义”成
为可能。一般而言,在使用function object的地方也常可以使用函数指针;在我
们还不熟悉function object的时候我们也常常是使用指针的。但定义一个函数指
针的语法可不是太简单明了,而且在C++中指针早已背上了“错误之源”的恶名。
更何况,通过指针调用函数增加了间接开销。所以,无论为了语法的优美还是效率
的提高,都应该提倡使用function objects。

下面我们再从设计模式的角度来更深入地理解function objects:这是Visitor模
式的典型应用。当我们要对某个/某些对象施加某种操作,但又不想将这种操作限
定死,那么就可以采用Visitor模式。在Design Patterns一书中,作者把这种模式
实作为:通过一个Visitor类来提供这种操作(在前面Bjarne Stroustrup的代码中
,Sum就是一个Visitor的变体),用Visitor类实例化一个visitor对象(当然,在
前面的代码中对应的是s);然后在Iterator的迭代过程中,为每一个对象调用
visitor.visit()。这里visit()是Visitor类的一个成员函数,作用相当于Sum类中
那个“特殊的成员函数”——operator();visit()也完全可以被定义为内联函数
,以去除间接性,提高性能。在此提请读者注意,C++把重载的操作符也看作函数
,只不过是具有特殊函数名的函数。所以实际上Design Patterns一书中Visitor模
式的示范实作和这里function object的实作大体上是等价的。一个function
object也就是一个特殊的Visitor。]




--
如果你真的爱萤火虫,你就不应该将她困在瓶子里;
如果你真的爱萤火虫,你应该放开她,让她在天空中自由自在地飞!
虽然你会不舍得她,但是最终你就会明白这样你才真正拥有了她!

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.223]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店