Контейнер шаблонов C без класса / структуры?

#c #templates #containers

#c #шаблоны #контейнеры

Вопрос:

Возможно ли иметь контейнер, который содержит значения другого типа? Что-то вроде:

 template<class Value>
std::map<std::string, Value> values;
  

Комментарии:

1. Вы можете создать контейнер для void*

2. С точки зрения строгой типизации C ответ отрицательный. С практической точки зрения, есть и другие варианты. Если вы можете опубликовать то, что пытаетесь выполнить, вы можете получить более полезную обратную связь.

3. std::map<std::string, boost::any>

4. Спасибо AK_ и преторианцу, мне нужно было что-то подобное. Я только что понял, что float * достаточно в том, что я делаю. (контейнер униформ (векторов, матриц …) в классе шейдеров)

Ответ №1:

Я не понимаю, почему вы хотите это сделать, можете ли вы уточнить это?

Вы не должны смешивать разные типы объектов в одной карте. Если вы это сделаете, как вы узнаете, какой тип хранится в каждой ячейке?

Если вы хотите сохранить некоторые пользовательские классы, лучше создать родительский класс и использовать map с этим родительским классом, а затем вы можете добавлять дочерние классы без каких-либо проблем.

Комментарии:

1. Если я знаю, что каждый отдельный тип значения, который я храню в своей карте, имеет метод, например, «getFloatArray ()», нет необходимости знать тип, я мог бы просто сделать «float * value = mymap [string].getFloatArray()» (это то, что мне нужно, плавающие массивы матриц, векторов и т. Д., Но я понял, что могу просто использовать float * для контейнера)

2. Да, вы можете это сделать, но если вы хотите сделать это правильно, если все ваши классы должны иметь метод getFloatArray() , тогда вам следует создать базовый класс с помощью этого метода и создать и массив с помощью этого класса. Это лучший дизайн, и вы избежите будущих проблем.