怪怪 | Nothing, Everything

"有过一个发疯的时刻,有感觉的钢琴以为它是世界上仅有的一架钢琴,宇宙的全部和谐都发生在它身上." - 狄德罗
随笔 - 67, 文章 - 2, 评论 - 1336, 引用 - 15
数据加载中……

C++/CLI和TMP: enum hack相當於static const int吗?

刚才闲着无聊, 睡不着觉, 在园子里乱翻, 看到这么一篇:

(原創) Template Metaprogramming系列[1] : 使用遞迴/递归(Recursive) (高級) (ISO C++) (C++/CLI) (TMP)

对这个话题和C++/CLI感兴趣的朋友可以先看看, 好知道我要说的是什么事, 不感兴趣的就可以点击右上角小叉子了.

文章中提到:

"夢在天涯 的C++的匿名枚举 中提到,enum hack其實相當於static const int,所以我們試著改用static const int"

这是个极端错误的理解. 基本概念C++教程上都有, 我就不唧唧歪歪了. 直接看看使用static const int的结果吧.


internal class F<8>
{
    
// Fields
    public static int modopt(IsConst) value = (F<7>.value * 8);

    
// Nested Types
    public enum Inner
    
{
        value 
= 0x9d80
    }

}


internal class F<9>
{
    
// Fields
    public static int modopt(IsConst) value = (F<8>.value * 9);

    
// Nested Types
    public enum Inner
    
{
        value 
= 0x58980
    }

}


 

不是C++代码? 那就对了, 这是用Reflector翻译成C#的结果, 虽然用C++也可以一眼看出问题, 不过用C#看起来更清晰一些. 大家可以想想看, 这根本上就是运行期的相互调用, 只是在静态构造时发生, 还能发挥TMP的作用吗? :P

反过来再看enum的值, 正是我们想要达到的编译期计算的结果. 所以当我们使用C++的TMP来进行计算时, 即使是Managed Class, 也只能使用enum来完成, 只是不能用匿名enum, 就得多打些字了.

虽然这个问题涉及到一些基本概念, 但有的时候, 基本概念也是细节, 不是说非得背的多么熟, 不过不知道的地方最好实践验证一下~ 尤其是凡事不能想当然, 比如在这个例子中, 人家正宗C++用enum, 并非只是一种习惯而已; 很多时候我们犯一些小错误, 不过是因为"想当然耳"罢了.

posted on 2008-02-23 08:51 怪怪 阅读(3180) 评论(5)  编辑 收藏

评论

#1楼    回复  引用  查看    

TMP 是什么呀?
2008-02-23 12:44 | 金色海洋(jyk)      

#2楼    回复  引用  查看    

同问TMP是什么?
2008-02-23 18:19 | Dream world 梦想天空      

#3楼    回复  引用  查看    

template meta programming
2008-02-23 19:31 | deerchao      

#4楼 [楼主]   回复  引用  查看    

@金色海洋(jyk)
@Dream world 梦想天空
就是LS说的, 模板原编程. C++的模板具有所谓的"图灵完备", 从理论上说, 可以支持任何我们想要的计算(只是编译器未必支持); 不过, TMP最多的用途, 还是在编译期进行类似于代码生成和组装的工作.

如果有构思, 我会写些这方面的入门文章, 看看如何配合我们平时的工作. 不过我的主要研究方向是, TMP如何改进或者影响我们平时的设计, 我的C++还比较菜, 未必能写好~
2008-02-23 21:29 | 怪怪      

#5楼    回复  引用  查看    

使用enum hack本身就是解决早期编译器的问题. 比如类型内部数组初始化. 只有95年前版本才考虑的.
2008-02-25 23:45 | kimiya25 [未注册用户]

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-02-23 09:17 编辑过
 
向地震灾区捐赠爱心