gpt4 book ai didi

c++ - 模糊指向堆或堆栈对象的智能指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:19 24 4
gpt4 key购买 nike

我的一个应用程序将从 std::unique_ptr<T> 的变体中受益匪浅可以将其配置为不总是承担所指向对象的所有权。

考虑以下类层次结构:

class AbstractFoo { ... };

template<typename T> Foo : public AbstractFoo
{
Foo( const AbstractFoo& absFoo ) { ... }
...
};

和一个 API,它标准化了每个接受 AbstractFoo 的例程并转换为 Foo<T> 的特定实例有必要的。在引用 AbstractFoo 的情况下实际上已经是正确派生类型的一个实例,只是一个 dynamic_cast是必需的,不需要复制数据。但是,当抽象引用的类型不正确时,需要执行重要的工作来创建请求格式的拷贝。

我想要的界面如下所示:

template<typename T>
my_unique_ptr<Foo<T>> Convert( AbstractFoo& absFoo )
{
if( Foo<T>* foo = dynamic_cast<Foo<T>*>(&absFoo) )
return my_unique_ptr<Foo<T>>( foo, false );
else
return my_unique_ptr<Foo<T>>( new Foo<T>(absFoo) );
}

void Bar( AbstractFoo& absFoo )
{
my_unique_ptr<Foo<T>> ptr = Convert<T>( absFoo );
...
}

类(class)在哪里make_unique_ptr<T>有一个类似于 std::unique_ptr<T> 的构造函数, 但带有一个可选的 bool 参数,该参数指定指针是否应由智能指针拥有。

是否有针对这种情况的最佳实践解决方案?我宁愿避免返回原始指针,因为如果在手动删除对象之前抛出异常,它可能会导致内存泄漏。

最佳答案

您可以将 shared_ptr 与自定义删除器结合使用:

template<typename T>
shared_ptr<Foo<T>> Convert( AbstractFoo& absFoo )
{
if( Foo<T>* foo = dynamic_cast<Foo<T>*>(&absFoo) )
return shared_ptr<Foo<T>>( foo, [](Foo<T>*){} ); // do-nothing deleter
else
return make_shared<Foo<T>>( absFoo ); // regular deleter
}

更新:programmerjake 显然在我打字时在评论中写了同样的想法。如果你想把它写成答案,我会删除我的。

关于c++ - 模糊指向堆或堆栈对象的智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25333492/

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