有时我倾向于编写函子,不是为了维护函数调用之间的状态,而是因为我想捕获一些函数调用之间共享的参数。举个例子:
class SuperComplexAlgorithm
{
public:
SuperComplexAlgorithm( unsigned int x, unsigned int y, unsigned int z )
: x_( x ), y_( y ), z_( z )
{}
unsigned int operator()( unsigned int arg ) const /* yes, const! */
{
return x_ * arg * arg + y_ * arg + z_;
}
private:
// Lots of parameters are stored as member variables.
unsigned int x_, y_, z_;
};
// At the call site:
SuperComplexAlgorithm a( 3, 4, 5 );
for( unsigned int i = 0; i < 100; ++i )
do_stuff_with( a ); // or whatever
相比
unsigned int superComplexAlgorithm( unsigned int x, unsigned int y,
unsigned int z, unsigned int arg )
{
return x * arg * arg + y * arg + z;
}
// At the call site:
auto a = std::bind( superComplexAlgorithm, 3, 4, 5, std::placeholders::_1 );
for( unsigned int i = 0; i < 100; ++i )
do_stuff_with( a );
在我看来,第一个解决方案有很多缺点:
x
,y
,做什么的文档z
在不同的地方 (构造函数, 类定义,operator()
) 进行拆分。- 大量的样板代码。
- 不太灵活。如果我想捕获不同的参数子集怎么办?
是的,我刚刚意识到有用boost::bind
或std::bind
可以。现在我的问题是,在我开始在我的很多代码中使用它之前:在任何情况下,我应该考虑在普通函数中使用手写的无状态仿函数来绑定参数吗?