16 c++ smart-pointers shared-ptr c++11
我试图弄清楚是否可以创建一个指向不同类型的共享指针数组.例如,类似的东西:
vector<shared_ptr<**???**>> v;
v.push_back(shared_ptr<int>(new int));
v.push_back(shared_ptr<MyClass>(new MyClass()));
Run Code Online (Sandbox Code Playgroud)
或任何其他方式通过shared_ptr而不知道其类型.
sfr*_*hse 27
更安全的类型可能是:
/// header #include <boost/variant.hpp>
typedef boost::variant < boost::shared_ptr < T1 >, boost::shared_ptr < T2 >, ... > VariantT;
std::vector < VariantT > container;
container.push_back ( boost::shared_ptr < T1 > ( new T1 ) ); // or boost::make_shared
container.push_back ( boost::shared_ptr < T2 > ( new T2 ) ); // or boost::make_shared
Run Code Online (Sandbox Code Playgroud)
更多介绍一下Boost.Variant库.
JBL*_*JBL 22
假设您要存储不继承公共类的对象,最简单的方法是使用boost::any.
您仍然需要确定每个索引存储的每个对象的类型(即能够执行正确的boost::any_cast).
你应该这样做,而不是存储指针void.这是最接近文本正确的方式来存储"你知道类型但编译器没有的东西",这意味着在检索值时使用了强制转换.
虽然两个(any和一个void指针)将以相同的方式(指针旁边)工作,但如果你转换为错误的类型,any将抛出bad_any_cast异常(IIRC),而使用void指针,你将得到未定义的行为.对coliru的简单尝试产生了一个段错误.
正如任何基本指针类型都可以转换为void*,任何shared_ptr将转换为shared_ptr<void>:
vector<shared_ptr<void>> v;
v.push_back(make_shared<int>());
v.push_back(make_shared<MyClass>());
Run Code Online (Sandbox Code Playgroud)
您现在拥有一个vector完全类型擦除的共享指针.然而,你无法做任何有趣的事情:你必须知道哪些类型存储在vector转换它们的哪些插槽中:
auto intptr = static_pointer_cast<int>(v[0]);
auto myclass_ptr = static_pointer_cast<MyClass>(v[1]);
Run Code Online (Sandbox Code Playgroud)
因此虽然可以做到这一点,但它并不是非常有用,可能表明设计已经破损.
| 归档时间: |
|
| 查看次数: |
2873 次 |
| 最近记录: |