gpt4 book ai didi

c++ - 使用 shared_ptr 提升 lambda

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:57:49 32 4
gpt4 key购买 nike

如果我有一个名为 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 快照。

最佳答案

class Base { 
public:
virtual ~Base() = 0;
};
Base::~Base() {}

class Derived1 : public Base {};
class Derived2 : public Base {};

typedef boost::shared_ptr<Base> BasePtr;

typedef boost::function<BasePtr()> Creator;
template <typename T>
Creator MakeFactory()
{
namespace la = boost::lambda;
return la::bind(
la::constructor<BasePtr>(),
la::bind(la::new_ptr<T>()));
}

int _tmain(int argc, _TCHAR* argv[])
{
std::map<std::string,Creator> map1;
map1["Derived1"] = MakeFactory<Derived1>();
map1["Derived2"] = MakeFactory<Derived2>();
BasePtr p1 = map1["Derived1"]();
BasePtr p2 = map1["Derived2"]();

return 0;
}

但是,既然可以写,为什么还要麻烦:

template <typename T>
BasePtr MakeFactoryImpl()
{
return BasePtr(new T());
}
template <typename T>
Creator MakeFactory()
{
return Creator(&MakeFactoryImpl<T>);
}

关于c++ - 使用 shared_ptr 提升 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7172424/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com