gpt4 book ai didi

C++ lambda ;类工厂适配器

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:35:12 25 4
gpt4 key购买 nike

给定一个类工厂

struct C {
C Factory(A a, B b, ...) { ... }
};

我想将它转换成一个以自动方式返回共享指针的函数。像这样的东西:

template<T (*f)(Args...), typename T, typename... Args>
boost::shared_ptr<T> blah(Args... args) {
return boost::shared_ptr<T>(new T(f(args...)));
}

我可以像这样使用:

shared_ptr<C> c = blah<C::Factory>(a, b, ...);

我使用的是 gcc4.4,但如有必要,我可以将 lambda 升级到 4.5。我这样做是因为在我问了this question之后,我现在需要转换我的类工厂以返回 shared_ptr,但我不想更改我的类定义 — 只需构建一个适配器。

最佳答案

不确定我是否理解问题,但有几点:

1) 如果您想将它们与 boost::smart_ptr 一起使用,工厂应该返回指向动态分配 对象的指针。对静态分配的变量使用智能指针(当对象超出范围并且没有其他 smart_ptr 拥有该对象的所有权时,它将尝试删除对象)是没有意义的。

2) 当你返回一个指针时(你的结构代码看起来像这样)

struct C {
C() { ... };
static C* Factory(A a, B b) {
...;
return new C;
}
};

那你就可以了

boost::shared_ptr<C> p_C(C::Factory(a,b));

所以我不太确定这个(可能非常复杂的)模板函数是否有用。(对我来说,这种工厂模式的使用似乎也很奇怪——据我所知,您通常希望抽象出正在创建的对象的确切类型,但这是另一回事)。

编辑:(回复评论,因为你不能格式化评论...)

我很确定使用指向静态分配变量的 shared_ptr 会导致双重删除错误(至少如果对象析构函数正在删除任何东西)。这肯定是一条危险的路径

你不能做吗(从链接的问题中复制)

shared_ptr<MyClass> CreateWithList(list lst) 
{
return shared_ptr<MyClass>(new MyClass(lst)); // construct with a list here
}

shared_ptr<MyClass> CreateWithPyArrayObject(PyArrayObject* obj)
{
return shared_ptr<MyClass>(new MyClass(obj)); // construct with numpy array here
}

?我的意思是我敢肯定实际情况比那更复杂,但现在它似乎比模板内容更容易。

顺便说一句:如果您只是追求 Python 中的 C 型速度,请提供 Cython试一试,真的很酷(即使现在不适用,将来可能会......)

关于C++ lambda ;类工厂适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5737931/

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