C++模板元编程

昨天WL发给我一段我觉得很“奇怪”的C++代码。。当时没看太懂,后来问了才知道是叫做模板元编程。

 

template struct binary { static unsigned const value = binary::value << 1 // prepend higher bits | N%10; // to lowest bit }; template <> // specialization struct binary<0> // terminates recursion { static unsigned const value = 0; };

 

觉得很新奇,于是乎索要了一本电子书,名为《Addison.Wesley. C++.Template.Metaprogramming》。

把第一章稍微看了一下,有点点晕菜,不过大概了解了模板元编程。

 

这本书不决定继续看下去,因为我觉得这种太技术底层的东西,需要用的时候再学吧。否则的话,知道这个技术,知道它能干嘛——就OK了。用某些专家的话说“研究C++就是浪费生命。”——虽然很偏激,但是有时候参考一下还是有道理的。

 

现在总结如下:

 

元编程(metaprogram),按字面上意思说就是“程序的程序”,它是一段程序,用来处理其他程序。比如咱们的编译器,可以处理咱们的代码成中间语言或者机器语言。YACC就是一个典型的代表。

 

元编程在C++中的具体体现是可以使用模板来实现。一般由算法构成模板和特化模板组成。算法构成模板用来描述具体解决方法,特化用来终结模板算法。

比如上面那段程序,前一段binary可以启动具体算法,而后面的binary<0>就是它的一个终结特化。

整个程序可以用来计算二进制转十进制,如 int k = binary<1001>::value 则可以得到二进制数1001转化为10进制的结果。

 

元编程有什么好处?

—— 它能打破编译器对你程序特性的限制,可以将一些计算移到编译时期(compile-time),节省在运行时(runtime)的计算时间。

所以我觉得它非常适合于封装底层代码,这样能极大效率的提高上层复用时的效率。将计算在编译期搞定。

 

另外C++的“准标准库”boost中提供了一个模板元编程的框架,叫MPL(Boost Metaprogramming Library),据说非常优美,我是没空去看了……

 

 

总之我觉得最大的亮点就是C++的模板元编程提供了可以在编译级别解决问题的方法,但其也有局限性,比如计算的肯定是内部生成的数据,而不能引用外部变量。——所以很适合底层封装度高的程序,上层会很受益。

 

你可能感兴趣的:(C/C++)