Template Explicit Specialization和普通函数有什么区别?

Sur*_*uri 10 c++ templates

template <class T>
void max (T &a ,T &b)
{}//generic template   #1

template<> void max(char &c, char &d)
{} //template specializtion    #2

void max (char &c, char &d)
{}//ordinary function      #3
Run Code Online (Sandbox Code Playgroud)

1,2和3有什么区别?

Gre*_*osz 10

  1. 是一个模板功能
  2. 是前一个模板函数的完全特化(不过载!)
  3. 是函数的重载

以下是C++编码标准的摘录:101规则,指南和最佳实践:

66)不要专门化功能模板

函数模板特化从不参与重载:因此,您编写的任何特化都不会影响使用哪个模板,这与大多数人直观期望的相反.毕竟,如果您使用相同的签名而不是函数模板专门化编写了非模板函数,则始终会选择非模板函数,因为它始终被认为是比模板更好的匹配.

本书建议您通过在类模板方面实现函数模板来添加间接级别:

#include <algorithm>

template<typename T>
struct max_implementation
{
  T& operator() (T& a, T& b)
  {
    return std::max(a, b);
  }
};

template<typename T>
T& max(T& a, T& b)
{
  return max_implementation<T>()(a, b);
}
Run Code Online (Sandbox Code Playgroud)

也可以看看: