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, 并非只是一种习惯而已; 很多时候我们犯一些小错误, 不过是因为"想当然耳"罢了.
原文地址:https://www.cnblogs.com/guaiguai/p/1078418.html