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

C++ How can I store multiple types in an vector of shared_ptrs?

本文关键字:向量 存储 类型 ptrs shared C++      更新时间:2023-10-16

如何在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。

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

    std::vector<std::shared_ptr<boost::variant<int, float>>>;
    
  2. 如果要存储任何内容,请使用boost::any。例如

    std::vector<std::shared_ptr<boost::any>>;
    

如果确实需要这样做,请使用boost::any。

并使用std::vector <std::shared_ptr<boost::any> > vec;

不能混合这样的类型。您可能想看看boost::any

不,C++不像许多其他语言那样有一个单一的类型来派生所有内容。intfloat本机类型,这意味着它们是语言的基础,而不是从其他任何语言派生的。

如果您有Boost的好处,您可以将anyvariant类型存储在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"

背后的概念相同