Как определить макрос / typedef / etc для tr1 :: unordered_map, который не связывает аргументы шаблона? - PullRequest
4 голосов
/ 06 марта 2012

Это может быть немного глупый вопрос, но я просто должен задать его. Я пытаюсь использовать класс unordered_map в C ++, но вместо того, чтобы ссылаться на него каждый раз как tr1 :: unordered_map, я хотел бы просто использовать ключевое слово hashMap. Я знаю, что

typedef tr1::unordered_map<string, int> hashMap 

работает, но этот тип исправляет тип данных ключа и значение, соответствующее hashMap, тогда как я хотел бы иметь больше как следующее:

#define hashMap tr1::unordered_map

, где я могу просто определить тип данных ключа и значение в зависимости от требования, но это не работает. Кто-нибудь сталкивался с этой проблемой раньше?

Спасибо

Ответы [ 2 ]

5 голосов
/ 06 марта 2012

Это то, чего не хватало в C ++ до C ++ 11. В C ++ 11 вы можете использовать template using:

template<typename Key, typename Value>
using hashMap = tr1::unordered_map<Key, Value>;

Обычный обходной путь для C ++ 03 состоит в создании структуры шаблона с type членом:

template<typename Key, typename Value>
struct hashMap {
  typedef tr1::unordered_map<Key, Value> type;
};
// then:
hashMap<string, int>::type myMap;

Теоретически наследование от класса возможно, но обычно пользователи воздерживаются от этого, поскольку классы STL не должны наследоваться от.

2 голосов
/ 06 марта 2012

Одной из возможностей было бы использование наследования для пересылки пары ключ / значение в unordered_map через шаблонный класс hashMap derrived. IE:

template<typename key, typename value>
class hashMap : public tr1::unordered_map<key, value>
{
public:
     // Add constructors to forward to tr1::unordered_map's constructors as
     // needed
     hashMap() : tr1::unordered_map<key, value>() {} 
     //...
};

Тогда вы можете использовать hashMap в качестве шаблона, но на самом деле использовать открытый интерфейс unordered_map.

hashMap<string, int> foo;
foo["bar"] = 5;

Просто не делайте ничего необычного, кроме форварда, так как типы STL не имеют виртуальных деструкторов.

...