Шаблонный класс в 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 было бы довольно сложно, хотя
Другие вопросы по тегам