std :: array中的模板类

时间:2014-09-16 21:24:22

标签: c++ c++11 stdarray

是否可以在std :: array中添加模板类而不指定typename?我的意思是。

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

std::array<MyClass *> arr;

原因是我有一种存储接受从MyClass派生的所有类,但模板类的问题是我需要指定typename,那么类必须是这样的:

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

我想要或多或少的东西:

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

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

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

一个选项是创建一个MyClass派生的基类,让数组存储指向基类的指针。

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

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

std::array<MyBase*> arr;

答案 1 :(得分:2)

  

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

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

  • 制作从非模板MyClass派生的模板BaseClass,并将指针指向BaseClass
  • 使MyClass非模板并创建一个从中派生的模板类。 (这在技术上与第一个相同)
  • 保留void *并在使用时将其投放到特定的MyClass<>,这很容易出错,但不建议这样做。
  • 使用boost::anyboost::variant(使用boost::variant会非常复杂,但