C++如何在shared_ptrs的向量中存储多个类型
C++ How can I store multiple types in an vector of shared_ptrs?
如何在std::vector中存储多个shared_ptr,每个shared_ptr都有一个指向不同类型的指针?
std::vector < ? > vec;
vec.push_back( make_shared<int>(3));
vec.push_back( make_shared<float>(3.14f));
有没有一个多态基类可以用于该任务,而不必使用编译器特定的东西?
有几种方法可以做到这一点。我假设您想要存储各种本机类型,因为您使用的是int和float。
-
如果您的类型列表是有限的,请使用boost::variant。例如
std::vector<std::shared_ptr<boost::variant<int, float>>>;
-
如果要存储任何内容,请使用boost::any。例如
std::vector<std::shared_ptr<boost::any>>;
如果确实需要这样做,请使用boost::any。
并使用std::vector <std::shared_ptr<boost::any> > vec;
不能混合这样的类型。您可能想看看boost::any
不,C++不像许多其他语言那样有一个单一的类型来派生所有内容。int
和float
是本机类型,这意味着它们是语言的基础,而不是从其他任何语言派生的。
如果您有Boost的好处,您可以将any
或variant
类型存储在vector
中。
我需要至少1个shared_ptr来保持资源的活动
为了实现这一点,存储的所有类型都必须从同一基类继承,该基类与共享指针中包含的类型相同。此外,基类必须声明一个虚拟析构函数(请参阅此问题)。
使用boost::any
意味着对象的每隔一个shared_ptr
也必须是shared_ptr<bsst::any>
,这可能不是您想要的。
我想解决这个问题的一种可能方法是执行以下
class ISomething{
bool isAlive;
public:
virtual bool alive(){ return isAlive;}
virtual ~ISomething() {}
};
template <typename T>
class Something: public ISomething{
std::shared_ptr<T> myRes;
public:
};
std::vector<ISomething*> myVec; //push back a new dynamic allocation for each "Something"
这基本上是类型擦除,与"Boost::Any"、"Poco::Any"、"Ogre::Any"
相关文章:
- 访问存储在向量C++中的结构的多态成员
- 添加存储在向量中的大整数的函数出现问题
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如何从用户那里获取输入并将其存储在向量中?
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 在二维向量或数组中可以存储的最大元素数是多少?
- 存储在堆分配向量中的指针的免费存储
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- Sqlite3:将数据库表名存储在向量中
- 如何在数组和向量 c++ 中存储和保存输入
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- 代码将向量存储为向量<vector>,为什么没有错误消息?
- 替代STD ::向量存储参考而不是对象的副本
- 将向量存储在<file> CStringArray 中?
- 将可变大小结构的向量存储在c++中的二进制文件中
- 使用向量c++存储和洗牌一副牌
- 将指针向量存储在文件中并再次读取它们
- 是否可以/建议将向量存储在结构中?C++