C++ 模板同时使用默认参数和偏特化
正常的偏特化都很简单,但是如果和默认参数碰到一起就会复杂一点点
先讲答案(按照顺序):
- 如果显示指定了,首先看显示指定的
- 如果没显示指定,就找是否有默认参数的版本
- 如果都不匹配,才会用最基本的去实例化
示例代码:
// 3. generate new version
template <typename T, typename = void>
struct A {T pp;
};// 1. search explicit specified
template <typename T>
struct A<T, int> {T a;
};
// 2. search default type
template <typename T>
struct A<T> { // euqal: struct A<T,void>T b;
};void Test() {A<int, int> test1;test1.a = 1;A<int> test2;test2.b = 1;A<int, void> test3;test3.b = 1;A<int, float> test4;test4.pp = 1;
}
在这里标出了1,2,3的寻找顺序。
注意几点:
struct A<T>
的偏特化其实和写struct A<T,void>
是一样的,这里偏特化出来了默认的版本- 如果这里不写
A<int, float> test4;
,也就是最基本的不会实例化,所以最基本的定义写不写都行,在这种情况下只需要写出声明可以让后面偏特化知道形式就好了。也就是template <typename T, typename = void> struct A;