用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> true_;
typedef bool_<false> false_;
怎么理解这几行代码?定义了一个空的结构,空的模板,实在看不出它有什么用。但这,就是整个空空运算的基石。
附件中的1.cpp,演示了用模板的特例化功能,区分一个数据类型是不是数组。
请仔细体会以上代码。
苏州 WinMount 继续招C++程序员,请把简历发到 support@winmount.com
- 标 题:用FOR_EACH学习空空运算
- 作 者:LiuTaoTao
- 时 间:2011-01-26 13:02:01
- 链 接:http://bbs.pediy.com/showthread.php?t=128639