首页 > 编程知识 正文

c5运输机和c17的区别,模板匹配原理

时间:2023-05-06 17:03:50 阅读:169305 作者:807

目录

模板参数自动导出

样品

在自定义类模板中的应用

自动导出Automatic deduction guides模板参数在C 17之前,类模板生成器的模板参数不会像函数模板的模板参数那样自动导出。 例如,我们没能写

std:pair a{1,' a's}; 只能用//C 17写

std:pairint,string a{1,' a's}; //C 14为了弥补这一缺点,标准库提供了从函数模板的模板参数自动导出std:make_pair函数的功能。

我们在构建pair的时候省去写模板参数的麻烦。

autoa=STD:3360make_pair(1,' a's ); //C 14//对应于//std:pairint,string(1a=STD : make _ pair int,string (1,string ) ' a ); //其中编译器从std:make_pair的参数类型中自动导出了函数模板的参数。 这个解决方案实际上不太理想。 这是:

您必须记住构建make_pair、make_tuple这样的模板类的惯用方法。 某些make_XXX函数在功能上与类模板的构造函数不等效,例如make_shared。 在C 17中,该问题得到解决,类模板生成器的模板参数也可以自动导出

std:pair a{1,' a's}; //C 17//是//std:pairint,string a{1,' a's}; 与//函数模板类似,编译器根据std:pair构造函数的参数类型自动导出了构造函数模板的参数。 这样就不需要std:make_pair等辅助函数了。

示例# include iostream # include vector # include functional # include string # includealgorithmusingnamespacestd; int main () ) vectora={ 1,2,3 }; //c17//vector inta={ 1,2,3 }; //c14functionf=[](inta ) {return a 1; (; //c17//functionint(int ) f=[] ) inta ) {return a 1; (; //c 14 tuplet { 1,2,5,' a's}; //C 17//tupleint,double,stringt { 1,2,5,' a's}; //C14//autot=make _ tuple (1,2,5,' a's ); //c14sort(a.Begin (,a.end ),greater{} ); //c17//sort(a.begin (,a.end ),greater{} ); //c14//sort(a.begin (,a.end ),greaterint{} ); //C 11 //map m={{1,' a's},{2,' b's}; //{1,' a's}编译器将映射类模板的参数类型map m={pair{1,' a's},{2,' b's}; //C 17//mapint,string m={{1,' a's},{2,' b's}; //C 14}指向自定义类模板的templatetypenametstructcontainer { container (t * ptr ) }//构造函数1 container (TV ) }//构造函数结构删除器{ }; int main ()容器c ((int * )0); //构造函数1调用1 int x的Container c2{x}; //构造函数2 Container c3{0}; //构造函数3调用3 Deleter d的containerC4{(int* ) 0,d}; //container int } automaticdeductionguides (automaticextensionwizard )4//在某些情况下,编译器自动推导出的结果是类模板的爸爸例如,如果以下模板参数类型是嵌套的:

在这种情况下,必须添加自动推断向导,以帮助编译器进行自动推导。

自动估算向导的格式如下。

类名(参数列表) -类模板idtemplatetypenametstructtraits (using type=t; (; templatetypenametstructcontainer//参数类型是嵌套的,container (typenametraitst 33603360 typev ) }; //自动估计向导templatetypenametcontainer(t )- ContainerT; int main () containerc ) ) 0; //编译器自动导出的结果Containerint}本文来源于https://www.cn blogs.com/zw vista/p/7748363.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。