类似于std :: shared_ptr中的“从/转为空”

时间:2012-09-15 20:26:48

标签: c++ pointers casting shared-ptr

我正在使用std::shared_ptr<T>用于许多不同的类型。由于我想将所有这些不同的shared_ptr存储在一个向量中,因此我认为如果需要,可以使用std::vector<std::shared_ptr<void> >并从void投射。

我熟悉以下“裸指针”用法

#include <iostream>

void print(void* void_ptr)
{
    int* int_ptr = static_cast<int*>(void_ptr);
    std::cerr << *int_ptr << std::endl;
}

int main()
{
    int* int_ptr = new int(4);
    void* void_ptr = static_cast<void*>(int_ptr);
    print(void_ptr);
    delete int_ptr;
}

这与g++完美无瑕,如果你有指针,这是正确的方法。但现在我希望与std::shared_ptr s相同。

#include <iostream>
#include <memory>

void print(std::shared_ptr<void> void_ptr)
{
    std::shared_ptr<int> int_ptr = ??(void_ptr); // simple cast won't work
    std::cerr << *int_ptr << std::endl;
}

int main()
{
    std::shared_ptr<int> int_ptr = std::make_shared<int>(4);
    std::shared_ptr<void> void_ptr = ??(int_ptr); // same problem here
    print(void_ptr);
}

这甚至可能吗?我有很多不同的类型shared_ptr,但这些类型几乎没有共同之处。他们不共享一个基类或类似的东西(如果这是唯一的方法,我会这样做,但对于某种shared_ptr<void>来说它肯定会更加棒极了。

2 个答案:

答案 0 :(得分:1)

std::static_pointer_cast执行此功能。但是,这通常是一个非常糟糕的主意 - 为什么不boost::anyboost::variant或其他什么?这种弱类型和弱强制执行的代码只会让你陷入麻烦。

答案 1 :(得分:0)

您问题的最佳解决方案可能是type erasure

看作C ++不允许模板之间的隐式转换(即使它们的参数是可转换的)。

所以你可以做的是定义一个你将容纳在容器中的公共接口(operator*operator->作为初学者),而不仅仅是在shared_ptr上使用瘦模板类来实现类型擦除。

修改

如@paercebal提出的问题所述,shared_ptr可以在模板参数为void时自行执行类型擦除。所以你也应该研究一下。