2011-06-30 7 views
18

boost :: bindは、多くの状況で非常に便利です。それらのうちの1つは、io_serviceがコールを後で行うことができるようにメソッド呼び出しをディスパッチ/ポストすることです。どのようにboost :: bind privateメソッドを呼び出すことができますか?

#include <boost/asio.hpp> 
#include <boost/bind.hpp> 

boost::asio::io_service ioService; 

class A { 
public:  A() { 
       // ioService will call B, which is private, how? 
       ioService.post(boost::bind(&A::B, this)); 
      } 
private: void B() {} 
}; 

void main() 
{ 
    A::A(); 
    boost::asio::io_service::work work(ioService); 
    ioService.run(); 
} 

しかし、私の知る限りでは、ブーストがファンクタを作成する(演算子(とクラスを()))できる:1は率直に期待するかもしれないような状況では

は、後押し::バインドは動作します指定されたオブジェクトの指定されたメソッドを呼び出します。そのクラスはプライベートBにアクセスする必要がありますか?私はそうは思わない。

私はここで何が欠けていますか?

答えて

35

アクセシビリティに関係なく、任意のメンバー関数をメンバ関数へのポインタで呼び出すことができます。関数がプライベートの場合、メンバーとフレンドだけがポインタを作成できますが、作成したポインタは何でも使用できます。

+8

プライベートスタティックメソッドへの通常のポインタについても同様です。 – MSalters

7

boost-to-member-functionを介して、boostはプライベート関数を呼び出します。クラスのメンバ関数はポインタを作成し、それをboostに渡し、その後boostはそのポインタを使ってクラスのオブジェクトのprivate関数を呼び出します。ここで

は、この基本的な考え方の一つの簡単な例です:

class A; 

typedef void (A::*pf)(); 

class A 
{ 
public:  
    pf get_ptr() { return &A::B; } //member function creates the pointer 
private:  
    void B() { cout << "called private function" << endl; } 
}; 

int main() { 
     A a; 
     pf f = a.get_ptr(); 
     (a.*f)(); 
     return 0; 
} 

出力:

は、ブーストを使用していませんが

プライベート関数を呼び出しますが、基本的な考え方まさにこれです。

メンバー関数とfriendは、メンバー関数privateへのポインターを作成できることに注意してください。他の人はそれを作成することはできません。

デモat ideone:http://ideone.com/14eUh

+0

コードサンプルをありがとう! – Gabriel

関連する問題