专门化hashmap模板

Kri*_*ris 3 c++ hash templates std hashmap

我在C++中使用hash_map并希望为它提供简化的类型名称:

键类型和哈希功能始终相同.

stdext::hash_map<std::string, [MAPPED TYPE], CStringHasher>
Run Code Online (Sandbox Code Playgroud)

但是,每次我声明一个将字符串映射到类型X的哈希映射时,我真的不想写所有这些.

  • 我可以编写简化此操作的模板或宏吗?

所以上面的声明看起来像:

template<typename T> StringHashmap = stdext::hash_map<std::string, T, CStringHasher>

StringHashmap<int> mapA; //Maps std::string to int
StringHashamp<bool> mapB; //Maps std::string to bool
Run Code Online (Sandbox Code Playgroud)

Luc*_*lle 5

正如其他人所说,如果你可以使用C++ 0x,模板别名就是你要走的路:

template < typename MappedType >
using StringHashMap = stdext::hash_map< std::string, MappedType, CStringHasher >;

StringHashMap< int > mapA;
StringHashMap< bool > mapB;
Run Code Online (Sandbox Code Playgroud)

(正如@MSalters所说,如果你有C++ 0x可用,你应该使用std::unordered_map.)

否则,您仍然可以使用通常的解决方法,即定义包含typedef的类模板:

template < typename MappedType >
struct StringHashMap
{
    typedef stdext::hash_map< std::string, MappedType, CStringHasher > type;
};

StringHashMap< int >::type mapA;
StringHashMap< bool >::type mapB;
Run Code Online (Sandbox Code Playgroud)

这个解决方案的一个缺点(在SO上引起了很多问题)是你有时需要StringHashMap< T >::typetypename关键字作为前缀,以便向编译器声明这个名称有效地表示一个类型.在这个答案中我不会详述这个主题,您可以查看此常见问题解答,尤其是已接受的答案,以获取更多信息.(感谢@sbi引起这件事.)