0

0

模板参数自动推导怎么工作 C++17的类模板参数推导规则

P粉602998670

P粉602998670

发布时间:2025-08-05 10:32:01

|

889人浏览过

|

来源于php中文网

原创

类模板参数推导(c++tad)是c++17引入的特性,允许编译器在构造类模板对象时自动推导模板参数类型。1. 编译器根据构造函数参数自动生成或使用用户定义的推导指引来确定模板参数;2. 用户可自定义推导指引以控制更复杂的模板逻辑;3. 常见应用于标准库容器如std::vector、std::map等,简化代码书写;4. 推导指引不参与重载解析,仅用于模板参数推导阶段;5. 在模板参数存在依赖关系时可能需要手动编写指引以辅助推导。

模板参数自动推导怎么工作 C++17的类模板参数推导规则

类模板参数推导(Class Template Argument Deduction,简称CTAD)是C++17引入的一项重要特性,它让编译器能够在构造类模板实例时自动推导出模板参数类型,从而避免了显式指定模板实参的繁琐。

模板参数自动推导怎么工作 C++17的类模板参数推导规则

什么是类模板参数推导?

简单来说,当你用构造函数创建一个类模板对象时,编译器可以根据传入的构造函数参数来推断出应该使用哪个模板参数。比如:

模板参数自动推导怎么工作 C++17的类模板参数推导规则
std::pair p(1, 2.0); // C++17之后可以不写>

在C++17之前,你必须这样写:

立即学习C++免费学习笔记(深入)”;

std::pair p(1, 2.0);

而有了CTAD后,编译器会根据构造函数参数

1
2.0
自动推导出
int
double
作为模板参数。

模板参数自动推导怎么工作 C++17的类模板参数推导规则

CTAD的基本规则

CTAD的核心机制是构造函数推导指引(deduction guides)。这些指引告诉编译器如何从构造函数的参数类型中推导出模板参数。

主要规则如下:

  • 从构造函数自动生成推导指引:如果你没有手动定义任何推导指引,编译器会为每个构造函数生成一个隐式的推导指引。

  • 用户可以自定义推导指引:你可以手动编写推导指引来覆盖默认行为,这对复杂模板逻辑非常有用。

    Clickable
    Clickable

    用AI在几秒钟内生成广告

    下载

举个例子:

template
struct MyVector {
    MyVector(std::initializer_list list) { /* ... */ }
};

// 用户自定义推导指引
template
MyVector(std::initializer_list) -> MyVector;

现在你可以这样使用:

MyVector vec{1, 2, 3}; // 自动推导为 MyVector

常见应用场景与技巧

1. 配合标准库容器简化代码

C++17的标准库很多地方都支持CTAD,例如

std::vector
std::map
std::tuple
等。例如:

std::vector v{1, 2, 3}; // 推导为 std::vector
std::map m{{1, "one"}, {2, "two"}}; // 推导为 std::map

这大大提升了代码可读性和简洁性。

2. 使用推导指引控制模板参数

有时候你想让某个构造函数推导出不同的模板参数组合,这时候就需要自己写推导指引。

例如,想让一个包装类自动推导底层类型:

template
class Wrapper {
public:
    Wrapper(T value) : val(value) {}
private:
    T val;
};

// 手动添加推导指引
template
Wrapper(U) -> Wrapper>;

这样即使传入的是引用或const类型,也能正确推导出“原始”类型。


容易忽略的细节

  • 推导指引不会参与重载解析:它们只用于模板参数推导阶段,不是函数的一部分。
  • 推导失败时不会报错,而是尝试其他构造函数或指引
  • 注意模板参数的依赖关系:如果模板参数之间有依赖关系,可能需要显式写出推导指引来帮助编译器判断。

基本上就这些。CTAD虽然看起来只是个小语法糖,但实际使用中能显著减少冗余代码,提升表达力。掌握它的推导规则和使用技巧,对现代C++开发很有帮助。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

520

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

313

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

522

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

190

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

95

2025.10.23

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

459

2024.01.03

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

150

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号