zoukankan      html  css  js  c++  java
  • 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, 并非只是一种习惯而已; 很多时候我们犯一些小错误, 不过是因为"想当然耳"罢了.
  • 相关阅读:
    bzoj2434: [Noi2011]阿狸的打字机
    bzoj2830: [Shoi2012]随机树
    题解,作业*2
    bzoj1901: Zju2112 Dynamic Rankings
    luogu P4178 Tree
    CF1042C Array Product 分类讨论+贪心
    CF946D Timetable 动态规划
    CF597C Subsequences 树状数组 + 动态规划
    CF912D Fishes 期望 + 贪心
    bzoj 4321 queue2 dp
  • 原文地址:https://www.cnblogs.com/guaiguai/p/1078418.html
Copyright © 2011-2022 走看看