c – 如何以最少的代码优化翻译枚举?
发布时间:2020-12-16 09:28:41 所属栏目:百科 来源:网络整理
导读:通常情况下,您有两个等效但编号不同的枚举,并且您需要函数将元素从第一个枚举转换为第二个和反向的元素.这通常是非常繁琐的代码,并且无论何时添加新元素,您都必须确保将配对添加到转换和反向转换功能(它违反了 the DRY principle). 什么是最不容易出错的方法
通常情况下,您有两个等效但编号不同的枚举,并且您需要函数将元素从第一个枚举转换为第二个和反向的元素.这通常是非常繁琐的代码,并且无论何时添加新元素,您都必须确保将配对添加到转换和反向转换功能(它违反了
the DRY principle).
什么是最不容易出错的方法,仍然生成有效的代码?我提到了有效的部分,因为如果运行时查找不是问题,你可以制作一堆对并将它们放在std :: maps中.我更喜欢像手动编写从一个枚举值到另一个枚举值的大转换语句一样高效的东西. 使用一些boost预处理器魔法或一些模板hackery我相信你可以想出一些你写一对对的列表并生成转换和反向转换函数,但我不确定哪种方法更喜欢或为什么.这两种方法都因编译时间慢而难以诊断编译错误.或者可能完全采用其他方法? 解决方法
你在找这样的东西吗?没有经过测试,但应该可行.
(关于过早优化的标准警告和分析的需要适用; std :: map查找可能不是那么糟糕,巨大的切换表可能不那么好.) 枚举-impl.h: // No include guard. DEFINE_ENUM_PAIR(EGA_BRIGHT_RED,12,HTML_RED,0xff0000) DEFINE_ENUM_PAIR(EGA_BRIGHT_BLUE,9,HTML_BLUE,0x0000ff) DEFINE_ENUM_PAIR(EGA_BRIGHT_GREEN,10,HTML_GREEN,0x00ff00) DEFINE_ENUM_PAIR(EGA_BLACK,HTML_BLACK,0x000000) enums.cpp: enum EgaColorType { #define DEFINE_ENUM_PAIR(name1,value1,name2,value2) name1 = value1,#include "enums-impl.h" #undef DEFINE_ENUM_PAIR }; enum HtmlColorType { #define DEFINE_ENUM_PAIR(name1,value2) name2 = value2,#include "enums-impl.h" #undef DEFINE_ENUM_PAIR }; HtmlColorType ConvertEgaToHtml(EgaColorType c) { switch (c) { #define DEFINE_ENUM_PAIR(name1,value2) case name1: return name2; #include "enums-impl.h" #undef DEFINE_ENUM_PAIR default: assert(false); } EgaColorType ConvertHtmlToEga(HtmlColorType c) { switch (c) { #define DEFINE_ENUM_PAIR(name1,value2) case name2: return name1; #include "enums-impl.h" #undef DEFINE_ENUM_PAIR default: assert(false); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |