7

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

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

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

4

6 回答 6

7

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

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

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

    std::vector<std::shared_ptr<boost::any>>;
    
于 2013-06-24T15:22:38.757 回答
0

我真的需要这样做,使用boost::any

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

于 2013-06-24T15:22:54.457 回答
0

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

于 2013-06-24T15:22:56.990 回答
0

不,C++ 没有像许多其他语言那样派生所有东西的单一类型。 int并且float原生类型,这意味着它们是语言的基础,而不是从其他任何东西派生的。

如果你有 Boost 的好处,你可以存储anyvariant输入你的vector

于 2013-06-24T15:23:38.230 回答
0

我需要至少 1 个 shared_ptr 来保持资源活跃

为此,您存储的所有类型都必须继承自同一个基类,该基类与共享指针中包含的类型相同。此外,基类必须声明一个虚拟析构函数(参见这个问题)。

使用boost::any将意味着对象的每个其他shared_ptr对象也必须是 a shared_ptr<bsst::any>,这可能不是您想要的。

于 2013-06-24T15:42:02.913 回答
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 ”背后的概念相同

于 2013-06-24T15:45:50.620 回答