C ++如何在shared_ptrs的向量中存储多个类型?

时间:2013-06-24 15:16:05

标签: c++ templates vector shared-ptr polymorphism

如何在std :: vector中存储多个shared_ptr,每个都有一个指向不同类型的指针?

std::vector < ? > vec;
vec.push_back( make_shared<int>(3));
vec.push_back( make_shared<float>(3.14f));

是否有基本多态类可以用于该任务而无需使用特定于编译器的东西?

6 个答案:

答案 0 :(得分:7)

有几种方法可以做到这一点。我假设您要存储各种本机类型,因为您使用的是int和float。

  1. 如果您的类型列表有限,请使用boost::variant。 e.g。

    std::vector<std::shared_ptr<boost::variant<int, float>>>;
    
  2. 如果您想存储任何内容,请使用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 ++没有像许多其他语言那样派生所有内容的单一类型。 intfloat原生类型,这意味着它们是语言的基础,而不是来自其他任何内容。

如果您拥有Boost的优势,则可以在any中存储variantvector类型。

答案 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”背后的概念相同“