如何在std :: vector中存储多个shared_ptr,每个都有一个指向不同类型的指针?
std::vector < ? > vec;
vec.push_back( make_shared<int>(3));
vec.push_back( make_shared<float>(3.14f));
是否有基本多态类可以用于该任务而无需使用特定于编译器的东西?
答案 0 :(得分:7)
有几种方法可以做到这一点。我假设您要存储各种本机类型,因为您使用的是int和float。
如果您的类型列表有限,请使用boost::variant。 e.g。
std::vector<std::shared_ptr<boost::variant<int, float>>>;
如果您想存储任何内容,请使用boost::any。 e.g。
std::vector<std::shared_ptr<boost::any>>;
答案 1 :(得分:0)
我确实需要这样做,请使用boost::any。
并使用std::vector <std::shared_ptr<boost::any> > vec;
答案 2 :(得分:0)
你不能混合这样的类型。您可能需要查看boost::any
答案 3 :(得分:0)
不,C ++没有像许多其他语言那样派生所有内容的单一类型。 int
和float
是原生类型,这意味着它们是语言的基础,而不是来自其他任何内容。
如果您拥有Boost的优势,则可以在any
中存储variant
或vector
类型。
答案 4 :(得分:0)
我需要至少1个shared_ptr来保持资源的存活
为此,您存储的所有类型都必须从相同的基类继承,该基类与共享指针中包含的类型相同。此外,基类必须声明一个虚拟析构函数(参见this question)。
使用boost::any
意味着对象的每个其他shared_ptr
也必须是shared_ptr<bsst::any>
,这可能不是您想要的。
答案 5 :(得分:0)
我想通过以下方式解决这个问题的可行方法
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”背后的概念相同“