0

是否可以在不指定类型名的情况下在 std::array 中添加模板类?我是说。

template<typename T>
class MyClass
{
    ...
}

std::array<MyClass *> arr;

原因是我有一种接受所有派生类的存储,MyClass但模板类的问题是我需要指定类型名,然后类需要是这样的:

class Storage
{
    ...
private:
    std::array<MyClass<TYPE GOES HERE> *> arr;
}

我想要或多或少这样的东西:

class Storage
{
    ...
private:
    std::array<MyClass *> arr;
}

这样我可以添加任何派生自 MyClass 的类。

有没有办法做到这一点?

4

2 回答 2

3

一种选择是创建一个从中MyClass派生的基类,并让数组存储指向基类的指针。

struct MyBase
{
   virtual ~Base() {}
};

template<typename T>
class MyClass : public MyBase
{
    ...
}

std::array<MyBase*> arr;
于 2014-09-16T21:40:23.573 回答
2

原因是我有一种存储,它接受从 MyClass 派生的所有类

你不能创建一个派生自的类MyClass,你可以创建一个派生自MyClass<int>例如等的类。所以我看到的解决方案是:

  • 使模板MyClass派生自非模板BaseClass并保持指向BaseClass
  • 制作MyClass非模板并创建一个派生自它的模板类。(这在技术上与第一个相同)
  • 保留void *并将其转换为特定MyClass<>用途,但这很容易出错,不推荐。
  • 使用boost::anyboost::variantboost::variant虽然使用会很复杂
于 2014-09-16T21:38:26.737 回答