如果我有一個稱爲基地以及類Derived1和Derived2的從基地繼承多態基類。然後我可以使用boost :: lambda創建一個排序工廠。喜歡的東西:升壓拉姆達與shared_ptr的
typedef boost::function<Base *()> Creator;
std::map<std::string,Creator> map1;
map1["Derived1"] = boost::lambda::new_ptr<Derived1>();
map1["Derived2"] = boost::lambda::new_ptr<Derived2>();
(這不是真正的代碼,我只是想說明這個問題。)
這工作,所以後來我可以使用字符串做在地圖上查找和然後調用lambda函數來實例化該類。都好。
這裏的問題是,它是在原始指針打交道,我更願意使用智能指針(的std :: shared_ptr的)。
所以,如果我改變來自:
typedef boost::function<Base *>() Creator;
到:
typedef boost::function<std::shared_ptr<Base> >() Creator;
那麼我就要從這裏卡住。我使用boost ::拉姆達::綁定與升壓::拉姆達結合:: new_ptr試過,但我運氣不好,不能讓過去編譯錯誤。 (巨大的模板相關的錯誤輸出)。
我查看了StackOverflow中的其他類似消息,Using boost::bind and boost::lambda::new_ptr to return a shared_ptr constructor已關閉,但如果嘗試應用其解決方案,則會出現上述模板錯誤。
我很高興能提供的示例代碼和實際的錯誤,如果有幫助,但希望上面的信息就足夠了。我使用升壓1.47.0 GCC上4.6以及4.7快照在Fedora 15
這是一個關於強制智能指針實施到用戶的選擇有趣的一點,我沒有考慮到這一點。 –