C ++枚举等效 - 转换为常量表达式

时间:2011-11-22 08:17:45

标签: c++ enums switch-statement

基于这个问题:

"enum class" emulation or solid alternative for MSVC 10.0

我想问几件事。假设这段代码:

struct DeletionMode_E
{
    static DeletionMode_E const Off;
    static DeletionMode_E const DirSize;
    static DeletionMode_E const FileNumberSize;
    static DeletionMode_E const DirAndFileNumberSize;

    operator int const() const { return myVal; }

private:
    explicit DeletionMode_E(const int & v) : myVal(v) { }
    const int myVal;
};

他们随后的定义:

    Log4Reconstruction::DeletionMode_E const Log4Reconstruction::DeletionMode_E::Off(0);
    Log4Reconstruction::DeletionMode_E const Log4Reconstruction::DeletionMode_E::DirSize(1);
    Log4Reconstruction::DeletionMode_E const Log4Reconstruction::DeletionMode_E::FileNumberSize(2);
    Log4Reconstruction::DeletionMode_E const Log4Reconstruction::DeletionMode_E::DirAndFileNumberSize(3);

可以使用它:

    void Log4Reconstruction::setDeletionMode( Log4Reconstruction::DeletionMode_E const & delMode_in)
    {
        std::cout << delMode_in << std::endl;

        switch(delMode_in)
        {
        //case Log4Reconstruction::DeletionMode_E::Off: C2051 case expression not constant
        //  std::cout << "Off" << std::endl;
        //  break;
        case 1:
            std::cout << "File number" << std::endl;
            break;
        }
    }

为什么函数调用运算符被调用?为了解决案例陈述中的“问题”,如何手动调用它?我正在使用MSVS 2008 没有外部库可用。

2 个答案:

答案 0 :(得分:3)

这里没有声明函数调用操作符。

operator int const() const { return myVal; }

是用户定义的转换,它将类型为DeletionMode_E的对象转换为常量整数。要调用它,您必须执行强制转换(这在switch语句中隐式完成)。

答案 1 :(得分:2)

在C ++ 03中,函数调用不能出现在常量表达式(例如case标签)中,所以它是不行的。在C ++ 11中,您只需将转换函数和构造函数标记为constexpr

我不确定“函数调用操作符”是什么意思。如果你的意思是函数operator int const()(转换函数),则会调用它,因为switch语句需要一个整数表达式,因此转换函数用于执行转换 - 这就是它们的作用。顺便说一下,第一个const是无用的,它应该是operator int() const { return myVal; }。要手动调用它,只需使用通常语法中的名称:delMode_in.operator int const()

_E后缀似乎表明了枚举的某些方面的模拟。为什么不使用enum