0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【ModernCpp】新特性之CTAD代码示例

CPP开发者 来源:腾讯云计算 2023-12-20 14:00 次阅读

最近在阅读C++ Templates 2nd,发现有些很有意思的新特性,今天,借助本文,分享给大家。

从一个例子入手

首先,我们看如下例子:

template
classAdd{
public:
Add(Tfirst,Tsecond):first_{first},second_{second}{}
Tresult()const{returnfirst+second;}
private:
Tfirst_;
Tsecond_;
};

这个例子很简单,声明一个模板类Add,接收类型为T的构造函数Add,以及一个返回operator+结果的result()函数。

在c++17之前,如果我们要使用Add类,往往必须像如下这么做:

intmain(){
Addti(1,2);
return0;
}

即在实例化对象ot的时候必须指明类型int

自C++17起引入了新的特性Class Template Argument Deduction,简称为CTAD,即类模板参数推导,那么就可以像如下这样实例化ADD类:

intmain(){
Addti(1,2);//T被推导为int
Addtd{1.245,3.1415};//T被推导为double
Addtf={0.24f,0.34f};//T被推到位float
return0;
}

用例

上面的例子,我们已经体会到了CTAD带来的好处(代码间接),下面结合在项目中的用的例子更进一步的来说明CTAD。

相比我们都知道std::lock_guard类,其主要用了实现RAII功能,尤其在多线程环境中用的最多,如下:

std::mutexm;
std::recursive_timed_mutexrm;

voidfun1(){
std::lock_guardlg{m};
//dosth
}

voidfun2(){
std::lock_guardlg{rm};
//dosth
}

在C++17,我们往往得像上面这样写,即需要显式指定lock_guard的类型。但是,自C++17起,可以像如下这样写:

std::mutexm;
std::recursive_timed_mutexrm;

voidfun1(){
std::lock_guardlg{m};
//dosth
}

voidfun2(){
std::lock_guardlg{rm};
//dosth
}

显然,代码更加简洁统一。

限制

虽然CTAD用起来很方便,但是相对于不使用CTAD特性,有时候CTAD会存在一些问题,即编译器推导的类型并不是我们所预期的,仍然使用第一节中的例子:

intmain(){
Addts("hello,","world!
");
autoret=ts.result();

return0;
}

在编译阶段,会报如下错误:

error:invalidoperandsoftypes'constchar*const'and'constchar*const'tobinary'operator+'
Tresult()const{returnfirst_+second_;}

即编译器会将"hello "和"world! "推导成为const charconst,而c++的char是不支持operator+操作的,这就导致了上面的编译错误。

此时,我们可以使用C++17之前的实例方法即显示指明类型,如下:

intmain(){
Addts("hello,","world!
");
autoret=ts.result();

return0;
}

如果这样做的话,多少有点失去了CTAD的好处,为了解决这种类似的问题,C++17支持显示类型推导,即添加代码:

Add(constchar*,constchar*)->Add;

需要注意的是,这一行类型推导需要加在类声明之后,这样编译器在遇到参数为const cha*的时候,会自动将其推导为std::string.

这样,我们的例子最后如下:

Add(constchar*,constchar*)->Add;
intmain(){
Addts("hello","world!
");
ts.result();
}

以上~~

审核编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 多线程
    +关注

    关注

    0

    文章

    277

    浏览量

    19919
  • C++
    C++
    +关注

    关注

    22

    文章

    2104

    浏览量

    73480
  • 编译器
    +关注

    关注

    1

    文章

    1618

    浏览量

    49043

原文标题:【ModernCpp】新特性之CTAD

文章出处:【微信号:CPP开发者,微信公众号:CPP开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Labview提示用户输入示例

    Labview提示用户输入示例,很好的Labview资料,快来下载学习吧。
    发表于 04-19 11:17 0次下载

    excel vba代码 示例讲解

    excel vba代码 示例讲解
    发表于 09-07 09:36 25次下载
    excel vba<b class='flag-5'>代码</b> <b class='flag-5'>示例</b>讲解

    代码编写器Studio的新的和改进的特性详细概述

    该应用说明描述了代码编写器Studio的新的和改进的特性。 (CCS)2并提供如何使用新功能的说明。这是利用使用代码编写器Studio 2装运的现有示例
    发表于 04-25 15:08 1次下载
    <b class='flag-5'>代码</b>编写器Studio的新的和改进的<b class='flag-5'>特性</b>详细概述

    MSP430系列用户指导和示例代码

    MSP430系列用户指导和示例代码
    发表于 05-08 09:42 28次下载
    MSP430<b class='flag-5'>之</b>系列用户指导和<b class='flag-5'>示例</b><b class='flag-5'>代码</b>

    python代码示例基于Python的日历api调用代码实例

    本文档的主要内容详细介绍的是python代码示例基于Python的日历api调用代码实例。
    发表于 09-06 14:25 42次下载
    python<b class='flag-5'>代码</b><b class='flag-5'>示例</b><b class='flag-5'>之</b>基于Python的日历api调用<b class='flag-5'>代码</b>实例

    AD593X代码示例

    AD593X代码示例
    发表于 03-23 08:18 14次下载
    AD593X<b class='flag-5'>代码</b><b class='flag-5'>示例</b>

    BeMicro代码示例

    BeMicro代码示例
    发表于 05-10 12:21 0次下载
    BeMicro<b class='flag-5'>代码</b><b class='flag-5'>示例</b>

    ezLINX™示例PC应用程序源代码

    ezLINX™示例PC应用程序源代码
    发表于 06-05 19:12 1次下载
    ezLINX™<b class='flag-5'>示例</b>PC应用程序源<b class='flag-5'>代码</b>

    机器学习必学的Python代码示例

    机器学习必学的Python代码示例
    发表于 06-21 09:35 14次下载

    华为游戏服务示例代码教程案例

    概述 游戏服务kit安卓示例代码集成了华为游戏服务的众多API,提供了示例代码程序供您参考和使用,下面是对示例
    发表于 04-11 11:09 4次下载

    基于keil的AD7366示例代码

    基于keil的AD7366示例代码分享
    发表于 10-08 14:58 3次下载

    RAA489204 示例代码软件手册

    RAA489204 示例代码软件手册
    发表于 01-10 18:52 0次下载
    RAA489204 <b class='flag-5'>示例</b><b class='flag-5'>代码</b>软件手册

    RAA489204 示例代码软件手册

    RAA489204 示例代码软件手册
    发表于 06-30 19:23 0次下载
    RAA489204 <b class='flag-5'>示例</b><b class='flag-5'>代码</b>软件手册

    安全驱动示例代码和实现

    示例代码获取和集成 本示例中的驱动只实现了对内存的读写操作,并提供了测试使用的TA和CA。 读者可使用如下指令从GitHub上获取到示例代码
    的头像 发表于 10-30 16:07 611次阅读
    安全驱动<b class='flag-5'>示例</b><b class='flag-5'>代码</b>和实现

    自己编写函数示例代码很难吗?分享几个示例

    Q A 问: Arduino Uno的函数示例 我决定自己编写函数示例代码,因为这应该是Arduino中的基本示例。网络上确实有关于使用函数的文档,但是,如果要尝试使用
    的头像 发表于 11-16 16:05 487次阅读
    自己编写函数<b class='flag-5'>示例</b><b class='flag-5'>代码</b>很难吗?分享几个<b class='flag-5'>示例</b>!