【发布时间】:2011-08-24 08:16:06
【问题描述】:
如果我有一个称为 Base 的多态基类以及继承自 Base 的类 Derived1 和 Derived2。然后我可以使用 boost::lambda 创建一个工厂。比如:
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::lambda::bind 与 boost::lambda::new_ptr 结合使用,但我运气不佳,无法克服编译错误。 (大量与模板相关的错误输出。)
我检查过 StackOverflow 中的其他类似消息,Using boost::bind and boost::lambda::new_ptr to return a shared_ptr constructor 已关闭,但如果我尝试应用其解决方案,我会收到上述模板错误。
如果有帮助,我很乐意提供示例代码和实际错误,但希望以上信息就足够了。我在 GCC 4.6 上使用 boost 1.47.0,在 Fedora 15 上使用 4.7 快照。
【问题讨论】:
标签: c++ boost-lambda