2010-09-25 1 views
1

Интересно, можно определить общий C++ контейнер, который хранит элементы следующим образом:Помощь нужна с контейнером для общего элемента в C++

template <typename T> 
class Item{ 
typename T value; 
} 

Я знаю, что заявление необходимо определение пункта типа, такие как:

std::vector<Item <int> > items; 

есть ли шаблон дизайна или обертки, которые могут решить эту проблему?

+0

Я не уверен, что вы после. Например, ваш тип 'Item' ничего не хранит. И тогда вы показываете способ сделать что-то ('std :: vector >'), а затем спросите, можно ли это сделать. Почему, да, вы можете создать такой вектор. Или что вы хотите знать? – sbi

ответ

1

С 9 типов, ваш лучший выстрел использовать boost::variant, по сравнению с boost::any вы получаете:

  • тип безопасности (компилировать проверки времени)
  • скорость (аналогичные объединения, нет выделения кучи, нет typeid призывание)

Просто используйте:

typedef boost::variant<Type0, Type1, Type2, Type3, Type4, 
         Type5, Type6, Type7, Type8>  Item; 

typedef std::vector<Item> ItemsVector; 

Чтобы вызвать операцию на boost::variant, лучший способ - создать статического посетителя, прочитать об этом в documentation.

1

Если вам нужен контейнер, в котором могут храниться элементы любого типа, посмотрите на boost::any.

В вашем текущем вопросе нет большой разницы между std::vector<Item <int> > и std::vector<int>.

+0

Элемент класса хранит объект типа T. Например, Item должен хранить целое число в переменной «значение». – Ali

+0

Что вы пытаетесь достичь? Почему вы не можете просто использовать 'vector '? –

+1

Если типы, которые вы хотите сохранить в таком контейнере, известны во время компиляции, вы можете использовать boost :: variant вместо boost :: any, что добавляет некоторую безопасность типов. – smerlin

Смежные вопросы