我习惯了struct hash<template class Key>
形式的模板语法,但使用时有什么不同
template <> struct hash<Key>
?
namespace std {
template <>
struct hash<Key>
{
std::size_t operator()(const Key& k) const
{
....
}
};
}
请注意,我确实搜索了template <>
的含义,并且我理解(我希望)这是一种方式,当使用模式匹配来指定不匹配的情况时,但是与{{{}的用法一起使用1}}我不明白它的动机。
答案 0 :(得分:13)
有不同级别的模板专业化:
1)模板声明(无专业化)
template <class Key, class Value>
struct Foo {};
2)部分专业化
template <class Key>
struct Foo<Key, int> {};
3)完全/显性专业化
template <>
struct Foo<std::string, int> {};
然后,在实例化模板时,编译器将选择最专业的定义:
Foo<std::string, std::string> f1; // Should match #1
Foo<int, int> f2; // Should match #2
Foo<std::string, int> f3; // Should match #3
#1和#3也适用于模板功能。