Шаблонный класс в std::array
Можно ли добавить класс шаблона внутри 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.
Есть ли способ сделать это?
2 ответа
Одним из вариантов является создание базового класса, из которого MyClass
получает и позволяет массиву хранить указатели на базовый класс.
struct MyBase
{
virtual ~Base() {}
};
template<typename T>
class MyClass : public MyBase
{
...
}
std::array<MyBase*> arr;
Причина в том, что у меня есть своего рода хранилище, которое принимает все классы, производные от MyClass
Вы не можете создать класс, производный от MyClass
, вы можете создать класс, производный от MyClass<int>
например и т. д. Итак, решения, которые я вижу:
- Сделать шаблон
MyClass
полученный из не шаблонаBaseClass
и держать указатель наBaseClass
- Делать
MyClass
не шаблон и создать класс шаблона, который является производным от него. (технически это то же самое, что и первый) - Держать
void *
и привести его к конкретномуMyClass<>
при использовании это подвержено ошибкам, хотя и не рекомендуется. - использование
boost::any
или жеboost::variant
(с помощьюboost::variant
было бы довольно сложно, хотя