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

    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的原因,对此,在代码注释中都已有所说明,但这仅仅只是个人理解,如果有错,欢迎指正!

posted @ 2012-10-02 16:25  crazylhf  阅读(354)  评论(0编辑  收藏  举报