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