C++ 模板同时使用默认参数和偏特化

C++ 模板同时使用默认参数和偏特化

正常的偏特化都很简单,但是如果和默认参数碰到一起就会复杂一点点


先讲答案(按照顺序):

  1. 如果显示指定了,首先看显示指定的
  2. 如果没显示指定,就找是否有默认参数的版本
  3. 如果都不匹配,才会用最基本的去实例化

示例代码:

// 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;

你可能感兴趣的:(c++,开发语言)