正常的偏特化都很简单,但是如果和默认参数碰到一起就会复杂一点点
先讲答案(按照顺序):
示例代码:
// 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 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
的偏特化其实和写 struct A
是一样的,这里偏特化出来了默认的版本A test4;
,也就是最基本的不会实例化,所以最基本的定义写不写都行,在这种情况下只需要写出声明可以让后面偏特化知道形式就好了。也就是template struct A;