Как использовать typedef для общего класса в С++
Я пытаюсь использовать unordered_map. Но на некоторых серверах у нас нет библиотеки tr1. В тех случаях я хочу использовать карту.
Итак, я хочу написать заголовочный файл, в котором я буду использовать одну из следующих строк.
typedef tr1::unordered_map hashmap;
typedef map hashmap;
Моя проблема в том, что я использую здесь различные типы карт.
map<string, string>
map<string, int>
map <string, map<string,int>> ..etc
Если я могу использовать typedef для alias map или unordered_map как hashmap, тогда я могу использовать карту в качестве hashmap<string, string>
, hashmap<int, int>
в коде.
Есть ли способ сделать это, или если есть лучший способ, пожалуйста, предложите мне.
Спасибо
Винод
Ответы
Ответ 1
Для этого вам нужно использовать так называемую метафункцию:
template <typename Key, typename T>
struct hashmap {
typedef std::unordered_map<Key, T> type;
// or
//typedef std::map<Key, T> type;
};
Что будет использоваться следующим образом:
hashmap<int, float>::type some_map;
Это очень распространенная картина. С++ 0x делает это несколько проще, предоставляя улучшенный оператор using
, но на данный момент это лучшее, что есть.
Ответ 2
С++ 98 и 03 не предлагают поддержку шаблонов typedefs, но вы можете сделать это с С++ 0x.
В более ранних версиях вы можете использовать шаблонную структуру, которая имеет значение typedef, чтобы делать то, что вы хотите:
template <typename T1, typename T2>
struct hashmap
{
typedef std::map<T1, T2> type;
};
Обратите внимание, что это было для иллюзорной цели, и вам также могут потребоваться дополнительные параметры шаблона для покрытия оператора сравнения и распределителя.
Ответ 3
Это будет возможно в С++ 0x, но в настоящее время нет поддержки для алиасирования неспециализированных шаблонов. См.: https://en.wikipedia.org/wiki/C%2B%2B0x#Template_aliases
В качестве обходного пути вы можете использовать макрос для типа карты, например:
#ifdef HAVE_TR1
#include <tr1/unordered_map>
#define HASH_MAP std::tr1::unordered_map
#else
#include <map>
#define HASH_MAP std::map
#endif
В несвязанной заметке я бы назвал псевдоним "ASSOC_MAP" или даже просто "MAP" вместо "HASH_MAP". Последнее имя звучит так, будто вы используете хэши, убаюкивая пользователя, думая, что он имеет вставки и удаления по постоянному времени, а не O (log N).