Typedef класс шаблона без указания параметров шаблона

Я пытаюсь ввести unordered_map или std::map в зависимости от того, доступны ли библиотеки TR1. Но я не хочу указывать параметры шаблона. Из того, что я читал до сих пор, шаблоны typedef'ing без аргументов невозможны, пока не будет доступен официальный стандарт С++ 0x. Так кто-нибудь знает элегантный обходной путь для этого?

#ifdef _TR1
#include <unordered_map> 
typedef std::tr1::unordered_map MyMap; //error C2976: too few template arguments
#else
#include <map> 
typedef std::map MyMap; //error C2976: too few template arguments
#endif

person Rollin_s    schedule 24.09.2009    source источник
comment
См. этот очень близкий вопрос: stackoverflow.com/questions/544842/c-typedef-ing-stl и предоставленные ответы. Определения типов шаблонов не являются допустимыми командами C++.   -  person Benoît    schedule 25.09.2009
comment
Бенуа - Спасибо, это именно то, что я искал   -  person Rollin_s    schedule 25.09.2009
comment
Очень похожий вопрос: stackoverflow.com/questions/ 6907194/ У него есть еще один ответ, который здесь не упоминается: шаблон псевдонима в С++ 11   -  person Jayesh    schedule 31.07.2014


Ответы (2)


Я видел, как это делается, чтобы обернуть typedef в шаблонную структуру:

template<typename KeyType, typename MappedType>
struct myMap
{
#ifdef _TR1
    typedef std::tr1::unordered_map<KeyType, MappedType> type;
#else
    typedef std::map<KeyType, MappedType> type;
#endif
};

Затем в своем коде вы вызываете его так:

myMap<key, value>::type myMapInstance;

Это может быть немного более многословно, чем то, что вы хотите, но я считаю, что оно удовлетворяет потребности, учитывая текущее состояние C++.

person fbrereto    schedule 24.09.2009
comment
Это действительно обычный способ имитировать отсутствие определений типов шаблонов в C++. Однако я бы назвал тип typedef вместо значения, это кажется более правильным семантически и более идиоматично. - person Luc Touraille; 25.09.2009

Вы должны использовать полные типы для определения типов.

Вместо этого используйте макрос #define.

person ebo    schedule 24.09.2009
comment
Иногда лучше вернуться к старому. Программирование клейкой ленты в лучшем виде. - person Mark Ransom; 25.09.2009
comment
к сожалению, макросы не учитывают область действия. - person sellibitze; 25.09.2009