#include template< bool C_ > struct bool_ { enum { value = C_ }; }; typedef bool_ true_; typedef bool_ false_; template< typename T > struct is_array : false_ { }; template< typename T, int N > struct is_array< T[N] > : true_ { }; template< typename T, int N > struct is_array< T const[N] > : true_ { }; template< typename T > struct is_array< T[] > : true_ { }; template< typename T > struct is_array< T const[] > : true_ { }; int main() { // not support VC6 if(is_array::value == false) std::cerr << "int test ok" << std::endl; if(is_array::value == false) std::cerr << "int* test ok" << std::endl; if(is_array::value == true) std::cerr << "int[] test ok" << std::endl; if(is_array::value == true) std::cerr << "int[2] test ok" << std::endl; if(is_array::value == true) std::cerr << "const int[2] test ok" << std::endl; if(is_array::value == true) std::cerr << "int const [2] test ok" << std::endl; return 0; } /* 用FOR_EACH学习空空运算 上一次我出了一道题: http://bbs.pediy.com/showthread.php?t=127740 一道给C++高级程序员的题————写FOREACH 居然没有一个人肯认真做。 有一个人回答,用 #define FOREACH BOOST_FOREACH 没错,我出这一道题就是因为看了BOOST,发现它居然实现了一个这么奇妙的功能,我根本想不到用C++居然能这么做! 所以才希望大家能研究一下,究竟怎么样用C++实现这么一个貌似不可能实现的功能。 可惜居然没有一个人肯认真研究这个问题。 很多回贴都是说,意义不大。 什么叫意义大?什么叫意义不大? 这是一道题,你不会做,这就是意义。 这道题,会用到大量的模板运算,你做了它,就会学到这些东西,这就是意义。 如果你是高级程序员,你应该知道如何下手,怎么做,给你时间你总能做出来,而不是一筹莫展。这就是意义。 我希望大家踏实一点,多学一点C++基础,有好处的。 还有人说,这有什么用?单是这个FOR_EACH,已经很方便了。它比std:for_each方便多了,即使加了lambda支持,你试试 就知道了。 也许会有人说,我把BOOST代码抄下来不就行了吗?BOOST代码太复杂了,include关系复杂,如果真把实现FOR_EACH用到的 东西都抄下来,会有几十KB甚至更多。抄下来了你还是没有搞明白。 接下来,就让我们一点点研究它的实现。我是花了多天的时间,把BOOST代码一点点简化才得到的。不断感叹世间竟有如此 聪明之人,想出这么绝妙的主意。 因为VC6的模板功能问题太多,请使用VS2005以上编译器测试代码。 第一章 如何区分数组类型? 为了研究这个复杂的问题,我们把问题先简单化。第一个小问题,如何知道一个变量的数据类型是不是数组? 是不是一筹莫展,毫无思路? 原来,解决方法,是用模板的特例化功能。 模板的编译期运算,我给它起个名字叫“空空运算”。我们先引入空空运算的基础,两个常量 true_ 和 false_ : template< bool C_ > struct bool_ { enum { value = C_ }; }; typedef bool_ true_; typedef bool_ false_; 怎么理解这几行代码?定义了一个空的结构,空的模板,实在看不出它有什么用。但这,就是整个空空运算的基石。 附件中的1.cpp,演示了用模板的特例化功能,区分一个数据类型是不是数组。 请仔细体会以上代码。 */