2011-05-12 7 views
0

私はブーストを使用して工場出荷時のパターンを作成したいと考えブースト::工場:: enable_shared_from_thisクラス

class A : public boost::enable_shared_from_this<A> { 
    public: 
     typedef boost::shared_ptr<A> pointer; 

     static pointer create(tcp::socket& socket) { 
      return pointer(new A(socket)); 
     } 
    private: 
     A(&tcp::socket socket) : m_socket(socket) {} 

     tcp::socket& m_socket; 
} 

Class Aa : public A { 
    public: 
     typedef boost::shared_ptr<Aa> pointer; 

     static pointer create(tcp::socket& socket) { 
      return pointer(new Aa(socket)); 
     } 

    private: 
     Aa(&tcp::socket socket) : A(socket) {} 
} 

Class Ab : public A { 
    public: 
     typedef boost::shared_ptr<Ab> pointer; 

     static pointer create(tcp::socket& socket) { 
      return pointer(new Ab(socket)); 
     } 

    private: 
     Ab(&tcp::socket socket) : A(socket) {} 
} 

[...]

Class Ax : public A { 
    public: 
     typedef boost::shared_ptr<Ax> pointer; 

     static pointer create(tcp::socket& socket) { 
      return pointer(new Ax(socket)); 
     } 

    private: 
     Ax(&tcp::socket socket) : A(socket) {} 
} 

から誘導体化し、複数のクラスがあります。 :工場 私はそのような何かwrittedています

class MyFactory { 
    public: 
     static MyFactory* getInstance(); 

     typedef boost::function< A(tcp::socket) > a_fact; 

    private: 
     MyFactory() { 
      map["Aa"] = boost::bind(boost::factory<Aa::create>, _1); 
      map["Ab"] = boost::bind(boost::factory<Ab::create>, _1); 
      […] 
      map["Ax"] = boost::bind(boost::factory<Ax::create>, _1); 
     } 

     std::map<std::string, a_fact> map; 
    }; 

をそして、もちろん、それは、COMませんPIL ...私にエラーを与える :

MyFactory.cc:13: error: type/value mismatch at argument 1 in template parameter list for ‘template<class Pointer, class Allocator, boost::factory_alloc_propagation AP> class boost::factory’ 
MyFactory.cc:13: error: expected a type, got ‘Aa::create’ 

任意のアイデアを、どのように私はそれを実装する必要がありますか?

答えて

0

誰かが同じ間違いを犯した場合は、ここで答えを示します。 boost::factoryが動作する必要はありません。boost::functionを直接使用するだけで十分です。

ので

class MyFactory { 
    public: 
     static MyFactory* getInstance(); 

     typedef boost::function< A(tcp::socket) > a_fact; 

    private: 
     MyFactory() { 
      map["Aa"] = boost::bind(&Aa::create, _1); 
      map["Ab"] = boost::bind(&Ab::create, _1); 
      […] 
      map["Ax"] = boost::bind(&Ax::create, _1); 
     } 

     std::map<std::string, a_fact> map; 
    }; 

素晴らしい作品

0

documentationには、factoryテンプレートに渡される引数が結果として期待するポインタ型です。だからあなたの場合boost::factory<Aa::pointer>

+0

Constructorではなくstatic createメソッドを呼び出す必要があるため、これは機能しません。 – TheSquad