Why would one use function pointers to member method in C++?

前端 未结 10 2312
情书的邮戳
情书的邮戳 2021-02-10 23:48

A lot of C++ books and tutorials explain how to do this, but I haven\'t seen one that gives a convincing reason to choose to do this.

I understand very well why functio

10条回答
  •  失恋的感觉
    2021-02-11 00:13

    The single most important use of member pointers is creating functors. The good news is that you hardly even need to use it directly, as it is already solved in libraries as boost::bind, but you do have to pass the pointers to those libs.

    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();
    }
    

    You can see the simplicity of creating a thread that executes a given operation on a given instance of a class.

    The simple handmade approach to the problem above would be on the line of creating a functor yourself:

    class functor1
    {
    public:
        functor1( Processor& o, int v ) : o_(o), v_(v) {}
        void operator()() {
            o_.operation( v_ ); // [1]
        }
    private:
        Processor& o_;
        int v_;
    };
    

    and create a different one for each member function you wish to call. Note that the functor is exactly the same for operation and for another_operation, but the call in [1] would have to be replicated in both functors. Using a member function pointer you can write a simple functor:

    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;
    };
    

    and use it:

    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();
    }
    

    Then again, you don't need to even define that functor as boost::bind does it for you. The upcoming standard will have its own version of bind along the lines of boost's implementation.

提交回复
热议问题