2011-05-12 70 views
0

我有多個類與的boost ::工廠創建的boost :: 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) {} 
} 

我想創建一個使用升壓工廠模式: :工廠 我已經創作的類似的東西:

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

這將不起作用,因爲我應該調用靜態創建方法,而不是構造函數... – TheSquad 2011-05-13 13:28:17