首页 > 编程知识 正文

RANK函数,反函数怎么求

时间:2023-05-06 04:43:45 阅读:24614 作者:3328

今天,我想在开源项目中看到模板的使用,并重新复习一下这个内容。

重读以前读过的书,发现很多地方都有问题,以后没有再研究,再看也还是无知。

这次,我在网上别人的理解和自己实践,终于懂了一点,我会把他记录下来,以便以后容易看到。

templatetypenametstructidentity { typedef ttype; (; templatetypenamet=intvoidfunc (typenameidentityt :3360 type val,t=0((/) intmain ) { func } 123 ); //t-int func (123,123,0 ); //T - double return 0; }在示例中,identity填充模板禁用了形状参数val类型的自动派生。 但是,由于func将模板参数t的缺省类型指定为int,因此在func(123 )中,func的val参数为int类型。 另一方面,在func (123,123.0 )中,因为func的第二个参数123.0是双精度类型,所以模板参数t优先自动派生为双精度类型,在这种情况下,val的参数为双精度类型如上所示,identity外套系统写着禁用了形参的val的类型的自动导出,但我不明白这句话的意思。 直到我自己写这样的代码:

# includeiostreamusingnamespacestd; templatetypenametvoidfunc(tT1,T t2=0) { return; (}int main ) ) func ) 123,123.0; 返回0; }去除涂模板的代码,将模板更改为原样使用的类型。 编译时编译失败。 错误如下。

test.CPP : in function‘int main’: test.CPP 336013360173360 error : nomatchingfunctionforcallto‘func’(int | ^ test.CPP :6336063360 note : candidate :‘templateclasstvoidfunc (t,t )’6|void func’tt1, tt2=0(|^~~~test.CPP :6336063360 note : templateargumentdeduction/substitution failed : test.CPP :13360173360 note : deducedconflictingtypesforparameter‘t’(int’and‘double|^ 看这里,我想你会明白上述无效形参的自动导出的意思。

然后,他添加了外套类代码,发现可以正常编译和执行。

为了验证书中第一个代码的最后一句,将代码修改如下。

# includeiostreamusingnamespacestd; templatetypenametstructidentity { typedef ttype; (; templatetypenamettfunc (typenameidentityt :3360 typet 1,T t2 ) { cout 't1:' t1 endl; cout 't2:' t2 endl; 返回t1 T2; }int main () coutfunc ) 123,123.0 ) endl; 返回0; }发现打印内容如下。

t1:123

t2:123

246

无论如何都是整形啊。 不是双精度型啊。

模板函数在编译时实例化了一个特定函数,通过可执行文件中的函数符号可以看到编译器对此函数的具体化方式。

使用此命令查找可执行文件的符号表。 nm a.out | grep func

0000000000001286 w _ Z4 func idet _ n8 identity is0_ E4 typees0_

然后,用这个符号反推他的函数名。 cf ILT _ Z4 func idet _ n8 identity is0_ E4 typees0_

双精度双精度(identity双精度:3360类型,双精度) )。

确实是双精度型。

其中还包括函数模板的默认参数问题。

template typename T=int

void func (类型命名约定:3360类型值,T=0) ) ) ) ) ) ) ) ) )。

在这段代码中,T=0,我以前不明白他是什么意思,但今天我明白了他是函数的默认参数。 但是,此参数的类型是模板参数类型。

总结:

1、使用模板函数时,如果不指定模板参数类型,编译器会自动导出。

2、包装模板函数的参数类型时,例如,使用外套类时,需要禁用编译器的自动类型推导,并在调用时指定参数类型。

3、不使用函数中的参数,或者在头文件中声明时,可以不写参数名称(普通函数的情况我知道,但是模板函数暂时没有反应)。

书里还有几句总结性的话,一起写在这里:

1 .如果所有模板参数都具有默认参数,则函数模板的调用似乎是普通函数。 对于类模板,即使所有参数都具有默认参数,也必须在模板名称后加上“”进行实例化。

2、函数模板的默认模板参数不需要写在参数表的末尾。 (我的理解:模板参数的顺序与函数参数中使用的顺序不同,所以不需要最后写。 本书在调用函数模板时显示指定的模板参数,其填充顺序从右到左。 (这个是我测试的,但不是。 指定的模板参数从左向右输入)。

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