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, 并非只是一种习惯而已; 很多时候我们犯一些小错误, 不过是因为"想当然耳"罢了.
(原創) Template Metaprogramming系列[1] : 使用遞迴/递归(Recursive) (高級) (ISO C++) (C++/CLI) (TMP)
对这个话题和C++/CLI感兴趣的朋友可以先看看, 好知道我要说的是什么事, 不感兴趣的就可以点击右上角小叉子了.
文章中提到:
"在夢在天涯 的C++的匿名枚举 中提到,enum hack其實相當於static const int,所以我們試著改用static const int"
这是个极端错误的理解. 基本概念C++教程上都有, 我就不唧唧歪歪了. 直接看看使用static const int的结果吧.



























不是C++代码? 那就对了, 这是用Reflector翻译成C#的结果, 虽然用C++也可以一眼看出问题, 不过用C#看起来更清晰一些. 大家可以想想看, 这根本上就是运行期的相互调用, 只是在静态构造时发生, 还能发挥TMP的作用吗? :P
反过来再看enum的值, 正是我们想要达到的编译期计算的结果. 所以当我们使用C++的TMP来进行计算时, 即使是Managed Class, 也只能使用enum来完成, 只是不能用匿名enum, 就得多打些字了.
虽然这个问题涉及到一些基本概念, 但有的时候, 基本概念也是细节, 不是说非得背的多么熟, 不过不知道的地方最好实践验证一下~ 尤其是凡事不能想当然, 比如在这个例子中, 人家正宗C++用enum, 并非只是一种习惯而已; 很多时候我们犯一些小错误, 不过是因为"想当然耳"罢了.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器