Почему эта карта <int, auto> не разрешена? - PullRequest
3 голосов
/ 08 марта 2011

Я пытаюсь реализовать гетерогенную карту в C ++. Я знаю, что это уже обсуждалось ранее, но мне было интересно, почему следующее не разрешено:

map<int, auto> myMap;

Есть ли способ, с помощью которого я мог бы сделать вставку в карту простым, не прибегая к указателям (void *)?

Я думал о том, чтобы со временем сделать что-то вроде этого:

vector<int> v;
myMap.insert(make_pair<int, int>(1,12334));
myMap.insert(make_pair<int, vector<int>)(2, v));

Возможно ли это? или мои усилия бесполезны?

Спасибо

Ответы [ 4 ]

19 голосов
/ 08 марта 2011

auto не означает «это может быть любой тип».Это специальное ключевое слово, которое может использоваться только для объявления переменных, и его значение таково: «тип этой переменной совпадает с типом выражения, использованного для ее инициализации».Тип переменной auto так же неизменен, как и тип любой другой объявленной переменной;единственная разница в том, что вам не нужно указывать название типа.Поскольку auto - это не тип, а просто синтаксический сахар для упрощения объявлений, его нельзя использовать в качестве параметра шаблона.

5 голосов
/ 08 марта 2011

Просто для извлечения информации из этой вещи, каким бы был ее тип?

Вы хотите что-то вроде variant или any из библиотеки boost.Они по-прежнему строго типизированы, но с интенсивным использованием шаблонов.

2 голосов
/ 08 марта 2011

Это не разрешено, потому что это не имеет смысла.Вы не можете использовать значение из этой гипотетической конструкции с хранением некоторой мета-информации о том, какой тип хранится в каждом экземпляре (и большой оператор switch), например, Boost Variant делает.

2 голосов
/ 08 марта 2011

Вы ищете разнородную карту, а не однородную.Когда вы используете этот термин, в Google довольно много обращений, например Пересмотр гетерогенных контейнеров .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...