关于C模板的类型转换的讨论.PDFVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
关于C模板的类型转换的讨论

关于C++模板的类型 转换的讨论 ⽬录 讨论地址 原问题 我的解答 ⾸先看ff的情况。 来看f的情况。 这两天在饮⽔思源的C板,关于C++模板的类型转换 的⼀个讨论,后⾯是我的解答。 讨论地址 /bbstcon,board,C,reid,133 0078933,file,M.1330078933.A.html 原问题 今天在书上看到模板演绎的时候可以允许cast- down,于是我写了个东⻄ : 1 template bool _Test, class _Type = void 2 struct enable_if { }; 3 templateclass _Type 5 struct enable_iftrue, _Type { 6 typedef _Type type; 7 }; 8 9 class A { }; 10 class B : A { }; 11 12 template typename T 13 struct traits { static int const va lue = false; }; 1 15 template 16 struct traitsA { static int const value = true; }; 17 18 template typename T 19 void f(T, typename enable_iftraits T ::value ::type* = 0) { } 20 21 template 22 void fA(A, enable_iftraitsA ::v alue ::type*) { } 23 2 25 26 template typename T 27 class BB {}; 28 29 template typename T 30 class DD : public BBT {}; 31 32 template typename T void ff(BBT) {}; 33 3 int main(int argc, char * argv[]) 35 { 36 A a; B b; 37 DDlong dd; 38 //f(b); 39 ff(dd); 0 } 奇怪的是重载决议的时候, f 的情况下它就不让我 特化的 fA 进来。 但是在 ff 的情况下, ffBBlong 却进来 了。 在VC10和GCC3.4下测试 我的解答 我们来设⾝处地地作为编译器,看⼀遍到底发⽣了 什么。 约定符号# :A#B 是把 B 带⼊AT 的参数T 之后实例化得到的结果。 ⾸先看ff的情况。 1 DDlong dd; 处理到这句的时候,编译器看到了 DDlong 的实 例化,于是去实例化 DD#long ,继⽽实例化了 BB#long 。 1 ff(dd); 这句,⾸先计算重载函数集合。 第⼀步,需要从参数 DD#long - BBT 推断 ffT 的T 。根据函数模板参数推断规则 : :code:`class_template_nameT` 类型 的参数,可以⽤于推断 :code:`T` 。 于是编译器推断T 为 long 。这⾥就算不是 BB ⽽是完全⽆关的 CC 都可以推断成功,只要 CC 也是⼀ 个 CCT 形式的模板。 第⼆步,模板特化匹配。因为只有⼀个模板,所以 匹配了最泛化的 ffT 。 第三步,模板实例化。 推断了 long - T 之后,编译器实例化 ff#long 。 重载函数集合 : {ff#long} 然后重载抉择找到唯⼀的可匹配的实例 ff

文档评论(0)

wumanduo11 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档