成员指针最重要的一个用途是创建仿函数。好消息是你几乎不需要直接使用它,因为它已经在库中作为 boost::bind 解决了,但是你必须将指针传递给这些库。
class Processor
{
public:
void operation( int value );
void another_operation( int value );
};
int main()
{
Processor tc;
boost::thread thr1( boost::bind( &Processor::operation, &tc, 100 ) );
boost::thread thr2( boost::bind( &Processor::another_operation, &tc, 5 ) );
thr1.join();
thr2.join();
}
您可以看到创建对给定类实例执行给定操作的线程的简单性。
解决上述问题的简单手工方法是自己创建一个仿函数:
class functor1
{
public:
functor1( Processor& o, int v ) : o_(o), v_(v) {}
void operator()() {
o_.operation( v_ ); // [1]
}
private:
Processor& o_;
int v_;
};
并为您要调用的每个成员函数创建一个不同的成员函数。请注意,对于operation和another_operation的仿函数是完全相同的,但是在 [1] 中的调用必须在两个仿函数中复制。使用成员函数指针,您可以编写一个简单的仿函数:
class functor
{
public:
functor( void (*Processor::member)(int), Processor& p, int value )
: member_( member ), processor_(p), value_( value ) {}
void operator()() {
p.*member(value_);
}
private:
void (*Processor::member_)(int);
Processor& processor_;
int value;
};
并使用它:
int main() {
Processor p;
boost::thread thr1( functor( &Processor::operation, p, 100 ) );
boost::thread thr2( functor( &Processor::another_operation, p, 5 ) );
thr1.join();
thr2.join();
}
再说一次,您甚至不需要将仿函数定义为 boost::bind 为您完成。即将推出的标准将按照 boost 的实现有自己的 bind 版本。