在我使用的外部代码中有枚举:
enum En {VALUE_A, VALUE_B, VALUE_C};
在我使用的另一个外部代码中有3个#define指令:
#define ValA 5 #define ValB 6 #define ValC 7
很多时候我的int X等于ValA或ValB或ValC,我必须将其转换为相应的En值(ValA到VALUE_A,ValB到VALUEB等),因为某些函数签名具有enum En.很多时候我必须做相反的操作,将enum En翻译成ValA或ValB或ValC.我不能改变这些函数的签名,并且有很多这样的函数.
问题是:如何进行翻译?我应该创建2个强制使用的强制转换操作符吗?或者我应该只有2个明确使用的翻译函数:
En ToEn(int) int FromEn(En)
或任何其他解决方案?
既然你不能在这里施放,我会使用免费功能,如果有可能还需要转换的其他枚举,请尝试使它看起来有点像内置强制转换:
templateT my_enum_convert(int); template<> En my_enum_convert (int in) { switch(in) { case ValA: return VALUE_A; case ValB: return VALUE_B; case ValC: return VALUE_C; default: throw std::logic_error(__FILE__ ": enum En out of range"); } } int my_enum_convert(En in) { switch(in) { case VALUE_A: return ValA; case VALUE_B: return ValB; case VALUE_C: return ValC; // no default, so that GCC will warn us if we've forgotten a case } } En enumValue = my_enum_convert (ValA); int hashDefineValue = my_enum_convert(VALUE_A); enumValue = my_enum_convert (0); // throws exception
或类似的东西 - 如果在使用它时出现问题,可能会调整它.
我不会用隐式转换的原因是,有已经是从恩隐式转换为int,其给出了错误的答案.即使你可以用可以给出正确答案的东西可靠地替换它,结果代码看起来也不会像进行任何转换一样.IMO这会阻碍任何后来查看代码而不是键入转换例程的人会阻碍你.
如果要转换为int并从int转换为非常不同,那么您可以将模板和函数设置为不同的名称.
或者,如果您希望它们看起来相同(更像是static_cast),您可以这样做:
templateT my_enum_convert(En in) { switch(in) { case VALUE_A: return ValA; case VALUE_B: return ValB; case VALUE_C: return ValC; } } int hashDefineValue = my_enum_convert (VALUE_A);
如上所述,T必须从int进行隐式转换.如果您想支持只有显式转换的T,请使用"return T(ValA);" 而是(或者"返回static_cast