Класс шаблона в 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.

Есть ли способ сделать это?


person yayuj    schedule 16.09.2014    source источник
comment
Вы имеете в виду, как template <typename> class T?   -  person    schedule 17.09.2014
comment
Мне нужно сохранить шаблон ‹typename T›, но я хочу создать хранилище с классами, производными от этого класса MyClass, но я не могу этого сделать из-за шаблона, но мне нужно сохранить шаблон, потому что я его использую.   -  person yayuj    schedule 17.09.2014
comment
MyClass должен быть специализирован для конкретного типа, который будет фактически создан: MyClass<int>.   -  person πάντα ῥεῖ    schedule 17.09.2014
comment
Один из вариантов - также сделать Storage класс шаблона.   -  person Csq    schedule 17.09.2014
comment
@ πάνταῥεῖ - Я знаю, и в этом проблема, я не могу добавить еще один класс в std::array<MyClass<int>> arr;, если имя шаблона другое, понятно? Я хочу иметь возможность добавлять любой класс, производный от MyClass, независимо от имени типа шаблона.   -  person yayuj    schedule 17.09.2014
comment
@Csq - Но мне нужно будет создать хранилище для каждого типа. Разве это не головная боль?   -  person yayuj    schedule 17.09.2014
comment
MyClass<int> и MyClass<double> - совершенно разные типы. Если вам нужен массив, который может хранить указатели на оба, дайте им общий базовый класс или используйте стирание типа.   -  person T.C.    schedule 17.09.2014
comment
@ T.C. - Я знаю, что они разные, но я говорю о классе, который является одним и тем же, и от которого наследуются другие классы (конечно, есть шаблон, но это тот же класс). Мне просто интересно, есть ли способ сделать это.   -  person yayuj    schedule 17.09.2014
comment
@Deduplicator - я не использую ускорение и планирую использовать его, но я проверю его, и, возможно, это поможет мне с решением. Спасибо.   -  person yayuj    schedule 17.09.2014
comment
В C ++ нет шаблонных классов. Есть только шаблоны классов - шаблоны, которые можно использовать для создания классов. Шаблоны (шаблоны классов) сами по себе не классы (формочку для печенья нельзя есть - STL)   -  person dyp    schedule 17.09.2014
comment
Если ваш код позволяет это, вы можете создать не шаблон MyBaseClass и унаследовать от него MyClass, чтобы Storage содержал std::array<MyBaseClass *> arr;. Если вам нужно вызвать специфичные для T функции MyClass из Storage - тогда вы не сможете этого сделать, и, по сути, не можете сделать Storage класс независящим от T.   -  person Arnon Zilca    schedule 17.09.2014
comment
Отсюда не будет производных, если вы сами не дадите им ничего. @dyp Хорошая цитата. Я должен это помнить.   -  person T.C.    schedule 17.09.2014
comment
Мне просто интересно, есть ли способ сделать это. Исходя из общей базы IS. THE. ПУТЬ. Сделать это.   -  person n. 1.8e9-where's-my-share m.    schedule 17.09.2014
comment
@ArnonZilca - Да, я использую букву T внутри MyClass. - Я думаю, что единственное решение, которое я вижу, - это создать хранилище с шаблоном, как указано выше.   -  person yayuj    schedule 17.09.2014
comment
@dyp - Хорошая цитата, и я сказал шаблонный класс, потому что думал, что это то же самое, без порядка размещения слов (мое плохое).   -  person yayuj    schedule 17.09.2014
comment
@MrAlmighty Нет проблем с использованием T внутри MyClass. Важно то, что Storage его массив T не используется. Это делает возможной идею наследования.   -  person Arnon Zilca    schedule 17.09.2014
comment
@ArnonZilca - хранилище будет вызывать методы из объектов, находящихся в массиве. - Я буду избегать лишних комментариев и попробую здесь написать код и посмотреть, что я могу сделать, в любом случае, вы, ребята, уже как-то мне помогли.   -  person yayuj    schedule 17.09.2014


Ответы (2)


Один из вариантов - создать базовый класс, от которого наследуется MyClass, и позволить массиву хранить указатели на базовый класс.

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

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

std::array<MyBase*> arr;
person R Sahu    schedule 16.09.2014
comment
Несмотря на то, что другие участники помогли мне, и некоторые из них (например, ответ ниже) упомянули эту технику, и да, она сработала и кажется лучшей. Единственное, что для использования методов классов, производных от MyClass, - это то, что мне нужно объявить MyBase раньше. Полиморфизм. - person yayuj; 17.09.2014

Причина в том, что у меня есть своего рода хранилище, которое принимает все классы, производные от MyClass.

Вы не можете создать класс, производный от MyClass, вы можете создать класс, производный, например, от MyClass<int> и т. Д. Итак, я вижу следующие решения:

  • Сделайте шаблон MyClass производным от не шаблона BaseClass и сохраните указатель на BaseClass
  • Сделайте MyClass не шаблоном и создайте класс шаблона, производный от него. (это технически то же самое, что и первое)
  • Сохраняйте void * и при использовании используйте конкретный MyClass<>, это может привести к ошибкам и не рекомендуется.
  • Используйте boost::any или boost::variant (хотя использовать boost::variant было бы довольно сложно
person Slava    schedule 16.09.2014