是否可以在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的类。
有没有办法做到这一点?
答案 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::any
或boost::variant
(使用boost::variant
会非常复杂,但