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,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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值