如何在 C++ 中没有 std::static_pointer_cast 的情况下向下转换 shared_ptr?
How to downcast shared_ptr without std::static_pointer_cast in C++?
我们用EASTL,我不能用std::static_pointer_cast。
我在我的函数中收到一个指向基 class 的指针,但不知道如何正确转换它:
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
的末尾抛出一些异常(我没有看到异常,可能是因为我们的代码甚至不支持异常).
代码看起来不正确,但我找不到解决此问题的正确方法,我尝试了很多版本,但其中 none 个有效。
我认为转换的智能指针对象的生命周期存在问题。
如何让它发挥作用?
std::shared_ptr<firstCaseType>(static_cast<firstCaseType*>(command.context.get()))
这从 context
的所有权网络中提取了一个非拥有的原始指针,并将其传递给一个新的 std::shared_ptr
,就好像它是拥有的一样。解决方案是使用 std::shared_ptr
的别名构造函数 (overload #8 here):
std::shared_ptr<firstCaseType>(command.context, static_cast<firstCaseType*>(command.context.get()))
// ^^^^^^^^^^^^^^^
代码肯定是错误的。您最终有两个共享指针管理相同的底层原始指针。您在这里需要的是共享指针的 别名 版本(参见下面的完整示例):
#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()));
}
我们用EASTL,我不能用std::static_pointer_cast。
我在我的函数中收到一个指向基 class 的指针,但不知道如何正确转换它:
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
的末尾抛出一些异常(我没有看到异常,可能是因为我们的代码甚至不支持异常).
代码看起来不正确,但我找不到解决此问题的正确方法,我尝试了很多版本,但其中 none 个有效。
我认为转换的智能指针对象的生命周期存在问题。
如何让它发挥作用?
std::shared_ptr<firstCaseType>(static_cast<firstCaseType*>(command.context.get()))
这从 context
的所有权网络中提取了一个非拥有的原始指针,并将其传递给一个新的 std::shared_ptr
,就好像它是拥有的一样。解决方案是使用 std::shared_ptr
的别名构造函数 (overload #8 here):
std::shared_ptr<firstCaseType>(command.context, static_cast<firstCaseType*>(command.context.get()))
// ^^^^^^^^^^^^^^^
代码肯定是错误的。您最终有两个共享指针管理相同的底层原始指针。您在这里需要的是共享指针的 别名 版本(参见下面的完整示例):
#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()));
}