如何在C++中在没有std::static_pointer_cast的情况下向下转换shared_ptr



我们使用EASTL,而我不能使用std::static_pointer_cast
我在函数中收到一个指向基类的指针,不知道如何正确地转换它:

switch (command.code)
{
..
case CommandCode::firstCase:
firstCaseFunction(std::shared_ptr<firstCaseType>(static_cast<firstCaseType*>(command.context.get())));
break;
case CommandCode::secondCase:
secondCaseFunction(std::shared_ptr<secondCaseType>(static_cast<secondCaseType*>(command.context.get())));
break;
..
default:
break;
}

上面的代码进行了编译,但在firstCaseFunction/secondCaseFunction的末尾抛出了一些异常(我没有看到异常,可能是因为我们的代码中甚至不支持异常(。

代码看起来不正确,但我找不到这个问题的正确解决方案,我尝试了很多版本,但都不起作用
我认为casted智能指针对象的生存期存在问题。

如何使其发挥作用?

std::shared_ptr<firstCaseType>(static_cast<firstCaseType*>(command.context.get()))

这将从context的所有权网络中提取一个未拥有的原始指针,并将其传递给一个新的std::shared_ptr,就好像它拥有一样。解决方案是使用std::shared_ptr的别名构造函数(此处重载#8(:

std::shared_ptr<firstCaseType>(command.context, static_cast<firstCaseType*>(command.context.get()))
//                             ^^^^^^^^^^^^^^^

代码肯定是错误的。最终会有两个共享指针管理相同的底层原始指针。这里需要的是共享ptr的别名版本(见下面的完整示例(:

#include <memory>
struct Foo { };
struct Boo : Foo { };
void g(std::shared_ptr<Foo> f)
{
std::shared_ptr<Boo> p(f, static_cast<Boo*>(f.get()));
}

相关内容

  • 没有找到相关文章

最新更新