#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() , тогда вам следует создать базовый класс с помощью этого метода и создать и массив с помощью этого класса. Это лучший дизайн, и вы избежите будущих проблем.