此处包含个人理解。
-
为什么函数模板没有偏特化?
没必要,可以用函数重载代替。比如对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; }
-
函数模板匹配规则和顺序
参考 为什么不要特化函数模版?
函数模版重载解析的优先级(假设有普通函数,模版函数,模版函数特化等等复杂情况):
- 普通函数,如果类型匹配,优先选中,重载解析结束;
- 如果没有普通函数匹配,那么所有的基础函数模版进入候选,编译器开始平等挑选,类型最匹配的,则被选中,注意,此时才会进入第(3)步继续筛选;
- 如果第(2)步里面选中了一个模版基础函数,则查找这个模版基础函数是否有全特化版本,如果有且类型匹配,则选中全特化版本,重载解析结束,否则使用(2)里面选中的模版函数,重载解析依然结束。
- 如果第(2)步里面没有选中任何函数基础模版,那么匹配失败,编译器会报错,程序员需要检查下代码。
-
为什么类模板需要偏特化?
因为类没有重载的概念,只能通过偏特化来实现。(个人理解)
类似的,类也只能依靠偏特化和全特化来实现特化。