注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

C++ 模板元编程(Metaprogramming)就是一坨屎  

2011-12-02 19:50:19|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

看项目代码,之前的同事写的几个类不是一般的难看,我这辈子没看过这么难看的代码!

关键是他用的boost里面的Preprocessor库 (http://www.boost.org/doc/libs/1_48_0/libs/preprocessor/doc/index.html) 

说是思想来自 “C++ Template Metaprogramming”,我还特意下载了这书来看一下,实在感觉不到什么有用的地方。

 

“Google C++ Style Guide” 都指出这种“Metaprogramming”这种属于禁止使用的boost库了,这种鼓励导致代码可读性极差的用法实在应该被丢弃。(原文这么说的Some Boost libraries encourage coding practices which can hamper readability, such as metaprogramming and other advanced template techniques, and an excessively "functional" style of programming.)

  

=============================

  

aaa_1 ( class::aa() a){         

   a()

}

 

aaa_2 ( class::aa() a){         

   a()

}

 

bbb_3 ( class::bb()  b){         

   b()

}

 

......

 

 

 

大概是要写很多这样的函数,里面的代码和函数名字有点类似吧。然后呢,这个元编程用来干什么呢?

可以用来把字符组装起来自动生成各个不同函数的实现。

 

意思就是用类似这样一句话

BOOST_PP_CAT(xxxxx,BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(OPERATION_ELEM,  

BOOST_PP_CAT(XXXXXX,

 

其实就是些宏,自动把宏xxxxx 展开,BOOST_PP_CAT 其实类似 宏里面的 “##” 连接符BOOST_PP_SEQ_ELEM 就可以引用  1 2 34 序列什么的。然后 有类似这样的定义比如

#define aaa \

            bbb  \

            ccc 等等

 

 用preprocessor的宏展开后就自动生成多个模板。最后需要写具体函数名的地方都写

“BOOST_PP_CAT(BOOST_PP_SEQ_ELEM xxxxx" ,以前的函数名字不见了 ,XXXXX满天飞,看的天书一样。

 还有就是函数里面有另外一个类的成员函数作为函数指针,名字也是类似的,那也用这个元编程的宏了。

套用一句名言,现在硬盘那么便宜了,值得为了省那几分钱一kb的空间费,而搞这么一大堆东西吗!

 

总的来说,这个元编程就是垃圾,一点用处也没有。声称可以做一些编译期优化,可以得到更好的性能。但实在是得不偿失,不但代码可读性非常大差,调试也非常困难。完全可以设计一个更好的接口或者办法,在运行时达到同样的性能和目的。

  评论这张
 
阅读(1503)| 评论(4)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017