STD :: Referent_wrapper/std :: std :: vector的selution_ptr替代品
std::reference_wrapper/std::unique_ptr alternative for std::vector that stores polymorphic value
i通常将对象存储在 std::vector
中,并使用std ::移动以转移所有权。问题在于,与多态对象一起使用时,按值存储可能会导致切片。
此博客:https://oopscenities.net/2012/08/09/reference_wrapper/表明std::vector
可用于将多态对象存储在std::vector
中。问题是,由于std::reference_wrapper
只是存储对对象的引用,因此必须在std::vector<std::reference_wrapper<>>
的终生时间内保证对象的寿命。
eg:
class PolymorphicClass; //derived from SuperClass
namespace MyProject
{
class MyClass
{
public:
std::vector<std::reference_wrapper<SuperClass>> _member;
};
}
int main()
{
MyClass test;
test._member.push_back(PolymorphicClass());
}
这是行不通的。我可以使用std::unique_ptr
,而不是std::reference_wrapper
,但我想知道是否还有其他选择。
所有权的全部取决于该矢量的元素。如果您希望向量自己的它们,那么要走的方法是unique_ptr
。
如果,否则,您希望向量共享所有权以及代码中的其他系统,则可以使用shared_ptr
。
如果您不希望向量对对象持有任何所有权,但是仍然能够检查它们是否已被删除,那么走的方法将是weak_ptr
。考虑到最后两个选项要求使用shared_ptr
创建对象,并存储共享指针,以引用分配在堆栈中的对象(例如(很讨厌。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- 什么是 std::function::argument_type 的替代品?
- 对于C++,是否有任何现代的 std::strchr() 替代品?
- STD :: Referent_wrapper/std :: std :: vector的selution_ptr替代品
- 排序向量上 std::find_if 和 std::bind2nd 的替代品
- c++线程池:std::函数的替代品,用于将函数/lambdas传递给线程
- std::set的替代品(可以将元素从一个集合移动到另一个集合)
- std::thread是boost::thread的替代品吗?
- std::vector<std::unique_ptr>有什么更好的替代品<T>吗?
- std::advance的替代品,它不会修改输入
- C++ OpenMP 并行循环 - std::vector 的替代品
- 向量的向量作为有效的数据结构;std::vector<std::vector>的替代品<someType>
- 包含两个双精度的类是 std::complex 参数的有效替代品<double>吗?
- GCC 的 std::atomic_store(shared_ptr) 的替代品 <= 4.9?