在我使用的外部代码中有枚举:
enum En {VALUE_A, VALUE_B, VALUE_C};
Run Code Online (Sandbox Code Playgroud)
在我使用的另一个外部代码中有3个#define指令:
#define ValA 5
#define ValB 6
#define ValC 7
Run Code Online (Sandbox Code Playgroud)
很多时候我的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)
Run Code Online (Sandbox Code Playgroud)
或任何其他解决方案?
Ste*_*sop 11
既然你不能在这里施放,我会使用免费功能,如果有可能还需要转换的其他枚举,请尝试使它看起来有点像内置强制转换:
template<typename T>
T my_enum_convert(int);
template<>
En my_enum_convert<En>(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<En>(ValA);
int hashDefineValue = my_enum_convert(VALUE_A);
enumValue = my_enum_convert<En>(0); // throws exception
Run Code Online (Sandbox Code Playgroud)
或类似的东西 - 如果在使用它时出现问题,可能会调整它.
我不会用隐式转换的原因是,有已经是从恩隐式转换为int,其给出了错误的答案.即使你可以用可以给出正确答案的东西可靠地替换它,结果代码看起来也不会像进行任何转换一样.IMO这会阻碍任何后来查看代码而不是键入转换例程的人会阻碍你.
如果要转换为int并从int转换为非常不同,那么您可以将模板和函数设置为不同的名称.
或者,如果您希望它们看起来相同(更像是static_cast),您可以这样做:
template<typename T>
T 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<int>(VALUE_A);
Run Code Online (Sandbox Code Playgroud)
如上所述,T必须从int进行隐式转换.如果您想支持只有显式转换的T,请使用"return T(ValA);" 而是(或者"返回static_cast <T>(ValA);",如果你认为单arg构造函数是C风格的强制转换,因此是不允许的).