目录
模板参数自动导出
样品
在自定义类模板中的应用
自动导出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