如何使用智能指针动态上传和下传?

Car*_*bon 7 c++ dynamic-cast casting smart-pointers

我有一些带有通用接口的代码,我需要在其中进行强制转换.我现在正试图转换为智能指针,但遇到了一些错误.下面的代码重现了这个问题.我正在使用C++ 14,所以我认为这些东西现在应该自动运行了吗?

#include <memory>
#include <iostream>
int main()
{
    std::shared_ptr<int> a(new int);
    *a = 5;
    std::shared_ptr<void> b = std::dynamic_pointer_cast<void>(a);
    std::shared_ptr<int> c = std::dynamic_pointer_cast<int>(b);
    std::cout << *c; //should be 5
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试编译它时,我得到:

Error   C2680   '_Elem1 *': invalid target type for dynamic_cast    
Error   C2681   'int *': invalid expression type for dynamic_cast   
Run Code Online (Sandbox Code Playgroud)

猜猜我在语法上做了些蠢事?

eer*_*ika 5

规则与哑指针相同,除了你必须使用std::static_pointer_caststd::dynamic_pointer_cast不是static_castdynamic_cast.C++ 17将引入对应的内容reinterpret_cast,但不需要向上或向下转换,也不需要转换为void.

如何用智能指针动态上传?

类型层次结构中的转换是隐式的,因此不需要强制转换:

struct A{
    virtual ~A(){}
};
struct B:A{};

auto b = std::make_shared<B>();
std::shared_ptr<A> a = b;
Run Code Online (Sandbox Code Playgroud)

我如何使用智能指针进行动态...向下转换?

使用std::dynamic_pointer_cast如果您不确定源指向正确的类型是否.这只有在继承是多态的情况下才有可能(即基类至少有一个虚函数):

b = std::dynamic_pointer_cast<B>(a);
Run Code Online (Sandbox Code Playgroud)

或者,std::static_pointer_cast如果您知道类型是正确的:

b = std::static_pointer_cast<B>(a);
Run Code Online (Sandbox Code Playgroud)
std::shared_ptr<void> b = std::dynamic_pointer_cast<void>(a);
std::shared_ptr<int> c = std::dynamic_pointer_cast<int>(b);
Run Code Online (Sandbox Code Playgroud)

void并且int没有继承关系,因此它们不能上升或下降.

但是,所有指针都可以隐式转换为void指针,因此可以进行隐式转换:

 std::shared_ptr<void> b = a;
Run Code Online (Sandbox Code Playgroud)

并且,void指针可以静态转换为原始类型,因此您可以使用std::static_pointer_cast:

std::shared_ptr<int> c = std::static_pointer_cast<int>(b);
Run Code Online (Sandbox Code Playgroud)