我正在使用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>
来说它肯定会更加棒极了。
答案 0 :(得分:1)
std::static_pointer_cast
执行此功能。但是,这通常是一个非常糟糕的主意 - 为什么不boost::any
或boost::variant
或其他什么?这种弱类型和弱强制执行的代码只会让你陷入麻烦。
答案 1 :(得分:0)
您问题的最佳解决方案可能是type erasure。
看作C ++不允许模板之间的隐式转换(即使它们的参数是可转换的)。
所以你可以做的是定义一个你将容纳在容器中的公共接口(operator*
和operator->
作为初学者),而不仅仅是在shared_ptr上使用瘦模板类来实现类型擦除。
修改强>
如@paercebal提出的问题所述,shared_ptr
可以在模板参数为void
时自行执行类型擦除。所以你也应该研究一下。