特化和偏特化

此处包含个人理解。

  • 为什么函数模板没有偏特化?

    没必要,可以用函数重载代替。比如对2个模板参数,需要偏特化一个,则可以用函数重载。

    template <typename T1, typename T2>
    void foo(T1 t1, T2 t2) {
        cout << "template" << endl;
    }
    
    template <typename T1>
    void foo(T1 t1, int t2) {
        cout << "partial specialization" << endl;
    }
    
  • 为什么不推荐函数模板全特化?

    没必要,重载函数即可。

    template <typename T1, typename T2>
    void foo(T1 t1, T2 t2) {
        cout << "template" << endl;
    }
    
    void foo(int t1, int t2) {
        cout << "full specialization" << endl;
    }
    
  • 函数模板匹配规则和顺序

    参考 为什么不要特化函数模版?

    函数模版重载解析的优先级(假设有普通函数,模版函数,模版函数特化等等复杂情况):

    1. 普通函数,如果类型匹配,优先选中,重载解析结束;
    2. 如果没有普通函数匹配,那么所有的基础函数模版进入候选,编译器开始平等挑选,类型最匹配的,则被选中,注意,此时才会进入第(3)步继续筛选;
    3. 如果第(2)步里面选中了一个模版基础函数,则查找这个模版基础函数是否有全特化版本,如果有且类型匹配,则选中全特化版本,重载解析结束,否则使用(2)里面选中的模版函数,重载解析依然结束。
    4. 如果第(2)步里面没有选中任何函数基础模版,那么匹配失败,编译器会报错,程序员需要检查下代码。
  • 为什么类模板需要偏特化?

    因为类没有重载的概念,只能通过偏特化来实现。(个人理解)

    类似的,类也只能依靠偏特化和全特化来实现特化。