使用空括号和结构的模板专业化

时间:2016-07-19 19:32:33

标签: templates c++11

我习惯了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}}我不明白它的动机。

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也适用于模板功能。