当前位置:  开发笔记 > 编程语言 > 正文

enum-int casting:运算符或函数

如何解决《enum-intcasting:运算符或函数》经验,为你挑选了1个好方法。

在我使用的外部代码中有枚举:

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)

或任何其他解决方案?



1> Steve Jessop..:

既然你不能在这里施放,我会使用免费功能,如果有可能还需要转换的其他枚举,请尝试使它看起来有点像内置强制转换:

template
T 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),您可以这样做:

template
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(VALUE_A);

如上所述,T必须从int进行隐式转换.如果您想支持只有显式转换的T,请使用"return T(ValA);" 而是(或者"返回static_cast (ValA);",如果你认为单arg构造函数是C风格的强制转换,因此是不允许的).

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有