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

时间:2010-04-28 10:22:37

标签: 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

1,2和3有什么区别?

2 个答案:

答案 0 :(得分:10)

  1. 是模板功能
  2. 是前一个模板函数的完全特化(不会超载!)
  3. 是函数的重载
  4. 以下摘自C++ Coding Standards: 101 Rules, Guidelines, and Best Practices

      

    66)不要专门化功能模板

         

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

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

    #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);
    }
    

    另见:

答案 1 :(得分:2)

模板参数的匹配规则与重载函数的匹配规则略有不同。当您尝试使用不同类型的参数调用max()时,可以看到不同的示例:

max(1,'2');

这将匹配重载函数,但既不匹配基本模板也不匹配特化。