繁体   English   中英

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

[英]C++ enum equivalent - convert to constant expression

基于此问题:

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;
        }
    }

为什么调用函数调用运算符? 一个人将如何手动调用它以解决case语句中的“问题”? 我正在使用MSVS 2008, 没有可用的外部库。

这里没有声明函数调用运算符。

operator int const() const { return myVal; }

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

在C ++ 03中,函数调用不能在常量表达式(例如case标签)中发生,因此是不可行的。 在C ++ 11中,您只需要将转换函数和构造函数标记为constexpr

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

_E后缀似乎表明对枚举的某些方面进行了仿真。 为什么不只使用enum

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM