2014-09-16 2 views
0

Можно ли добавить класс шаблона в 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.

Есть ли способ для этого?

+0

Вы имеете в виду, например, 'template class T'? – 2014-09-16 21:25:50

+0

Мне нужно сохранить шаблон , но я хочу создать хранилище с классами, которые происходят из этого класса' MyClass', но я не могу этого сделать из-за шаблона, но янужно сохранить шаблон, потому что я его использую. – yayuj

+0

'MyClass' должен быть специализированным для конкретного типа, который будет фактически создан:' MyClass '. –

ответ

3

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

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

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

std::array<MyBase*> arr; 
+1

Несмотря на то, что некоторые участники помогли мне, а некоторые из них (например, ответ ниже), упомянули эту технику, и да, это сработало и кажется лучшим. Единственное, что использовать методы классов, которые происходят из 'MyClass', это то, что мне нужно объявлять на' MyBase' раньше. Полиморфизм. – yayuj

2

Причина в том, что у меня есть вид памяти, который принимает все классы, унаследован от MyClass

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

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