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