【问题标题】:C++ enum equivalent - convert to constant expressionC++ 枚举等效 - 转换为常量表达式
【发布时间】:2011-11-22 08:17:45
【问题描述】:

基于这个问题:

"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 没有外部库可用。

【问题讨论】:

    标签: c++ enums switch-statement


    【解决方案1】:

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

    operator int const() const { return myVal; }
    

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

    【讨论】:

    • 感谢您的回复。是否有可能“以某种方式”将这种转换也用于这种情况?
    • @FailedDev:不适用于 C++03。正如@Potatoswatter 在他的回答中解释的那样,C++11 有 constexpr-keyword 。
    • 感谢您的帮助。我想我现在会坚持使用 int,并在我们迁移到 C++11 时更新它。
    【解决方案2】:

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

    我不确定您所说的“函数调用运算符”是什么意思。如果你的意思是函数operator int const()(转换函数),它被调用是因为switch 语句需要一个整数表达式,所以转换函数用于执行转换——这就是他们所做的。顺便说一句,第一个const没用,应该是operator int() const { return myVal; }。要手动调用它,只需按照通常的语法使用它的名称:delMode_in.operator int const()

    _E 后缀似乎表示对枚举某些方面的仿真。为什么不直接使用enum

    【讨论】:

    • 我认为 OP 想要模拟 Java-Enums 的一些功能,因此构造复杂。
    猜你喜欢
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多