Подтвердить что ты не робот

Как использовать 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> в коде.

Есть ли способ сделать это, или если есть лучший способ, пожалуйста, предложите мне.

Спасибо Винод

4b9b3361

Ответ 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).