C++设计新思维——编译期间侦测可转换性和继承性

本文深入探讨了C++中的编译期断言及类型检测技术,包括Int2Type和Type2Type的使用,以及如何利用类型特质和技术如Convertion检测类型间的可转换性和继承性。

    C++设计新思维的第2章,涉及各种技术:编译期Assert,偏特化的使用,内部类的使用,Int2Type实现整型数到类型的映射,Type2Type实现类型到类型的映射,Select技术实现类型选择,编译期间侦测可转换性和继承性,Type  Traits技术。

    其中Int2Type用于需要在编译期间通过整型数来执行分派,此时可将整型数映射为类型,然后通过函数匹配规则,在多个重载函数中选出最佳匹配的函数。Type2Type则用于需要在编译期间通过类型来执行分派,而原有类型有过于庞大,此时可运用Type2Type将原有类型映射为占用空间较小的类型,再进行分派。其余技术书中大多讲得通俗易懂,不再赘述。

    而对于技术:编译期间侦测可转换性和继承性,我个人,读完这块内容后,感觉茅塞顿开,其实主要的领悟来自于对sizeof的巧妙使用,以及Strawman Function的运用上(对于Strawman Function 我个人是这样理解的:它就是一个形式,没有具体内容,在此处,只是为了让sizeof获取其“运算”结果的类型,其实用“运算”这个词是不正确的,因为sizeof并不对其表达式求值,但我没有比较好的词,姑且用之)。具体看如下代码:(测试地址:http://codepad.org/HEVUicXT

 1 #include<iostream>
 2 
 3 using namespace std ;
 4 
 5 template<class T, class U>
 6 class Convertion
 7 {
 8    typedef char Small ;
 9    class Big { char dummy[2] ; } ;
10 
11    //必须是static,因为non-static在语法上需要指定调用object
12    //而enum成员的值在编译期确定,此时还没有任何对象。
13    //尽管sizeof不对表达式估值,但必须让表达式在编译期通过编译,
14    //然后sizeof才会在编译期获取表达式结果的类型大小
15 
16    static T makeT();
17 
18    static Big test(...);
19    static Small test(U);
20 
21 public:
22    enum{ exits = sizeof( test( makeT() ) ) == sizeof(Small) };
23 } ;
24 
25 int main( int argc, char **argv )
26 {
27    cout << Convertion<int, double>::exits << endl
28         << Convertion<char, char*>::exits << endl ;
29 
30    return 0 ;
31 }

运算结果:

Output:
1
2
1
0

 

侦测类Convertion中的Strawman Funciton :static T makeT();   static Big test(...);   static Small test(U);
书中并没有说明将其声明为static的原因,对此,在代码注释中都已有所说明,但这仅仅只是个人理解,如果有错,欢迎指正!

转载于:https://www.cnblogs.com/crazyhf/archive/2012/10/02/2710427.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值