【类模板】模板参数的推断

一、模板参数的推断

我们在实例化一个类模板的时候,有两种方法:

一种是使用 < T > <T> <T>来显式推断生成相应的类
另一种是不使用 < T > <T> <T>来隐式推断生成相应的类

具体如下:

template<typename T>
struct A {
	T val1, val2;
	A(T val1_, T val2_) : {}
};

void Test() {
	A(1, 1); //隐式推断
	A<int>(1, 1); //显式推断
}

其中,两种推断方案都基于构造函数,如果我们删除了构造函数,那么我们就无法生成相应的类。

二、模板参数的推断指南

1.隐式推断

模板的推断指南(deduction guide),是C++17引入的概念。
推断指南主要是用来在推断模板参数时提供推断指引。

通常情况下,编译器自带一个推断指南,形式上如:

//隐式推断
template<typename T>
A(T, T) -> A<T>;

所以,即使我们只要有构造函数,也可以不写这个推断指南,也能生成相应的类。

对于这个类

template<typename T>
struct B {
	T val1, val2;
	B(T val1_, T val2_) : {}
};

如果我们调用

void Test2() {
	B(1, 1); //调用隐式推断,推断为B<int>
}

那么将会实例化一个 i n t int int类型的 B B B类,因为此时调用的是默认的推断指南

2.自定义推断

但如果我们想要让其推断为 d o u b l e double double类型呢?
此时需要自定义一个推断指南,如下:

//显式推断
template<typename T>
B(T, T) -> B<double>;

void Test2() {
	B(1, 1); //显示调用自定义推断,推断为B<double>
}

此时生成的就是 d o u b l e double double类的 B B B类啦

3.无构造函数实例化

前面两种实例化模板的方式都是通过构造函数来实例化模板。
C + + C++ C++中,我们还可以通过初始化列表+推断指南的方式来实例化模板
具体代码如下:

template<typename T>
struct MyType {
	T val1, val2;
	//不存在构造函数
};

//显式推断
template<typename T> 
MyType(T,T) -> MyType<T>;

//使用初始化列表
void Test3() {
	//使用初始化列表相当于使用了构造函数
	MyType t1{ 1,1 };
	MyType<double>t2{2, 3};
}

我们通过 d u m p b i n dumpbin dumpbin来验证一下

在这里插入图片描述在这里插入图片描述

确实实例化出了这个类型。

当然,使用这种方法有局限性,需要满足以下条件:

在这里插入图片描述在这里插入图片描述

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值