"枚举类"仿真或MSVC 10.0的固体替代品

rub*_*nvb 12 c++ enums class visual-c++ c++11

我正在寻找一种解决以下问题的hacky解决方案:GCC 4.4+接受以下c ++ 0x代码:

enum class my_enum
{
    value1,
    value2
};
Run Code Online (Sandbox Code Playgroud)

允许使用这样的:

my_enum e = my_enum::value1;
Run Code Online (Sandbox Code Playgroud)

这带来了所有的钟声和口哨声.我想使这段代码与MSVC 2010兼容,即使用语法不会改变.我在此之前已经考虑过这个问题,并且接受的答案有效,但是枚举和枚举值的两个不同名称的需要正在破坏两种方法的兼容性.这使得它当然无法替换C++ 0x代码.我想知道是否有一些#undef和#define技巧可以解决这个问题,允许我使用 enum class类似语法(可能没有严格的类型安全性等),但至少是相同的语法.谢谢!

How*_*ant 21

我刚刚发现詹姆斯的好黑客(我以前一直在使用)的问题,并解决了这个问题.当我尝试为my_enum定义流运算符时,我发现了这个问题.

#include <iostream>

struct my_enum {
    enum type { 
        value1, 
        value2 
    };

    my_enum(type v) : value_(v) { }

    operator type() const { return value_; }

private:

    type value_;
};

std::ostream&
operator<<(std::ostream& os, my_enum v)
{
    return os << "streaming my_enum";
}

int main()
{
    std::cout << my_enum::value1 << '\n';
}
Run Code Online (Sandbox Code Playgroud)

输出是:

0
Run Code Online (Sandbox Code Playgroud)

问题是my_enum::value1有不同的类型my_enum.这是詹姆斯'哈克的一个黑客,我提出了.

struct my_enum
{
    static const my_enum value1;
    static const my_enum value2;

    explicit my_enum(int v) : value_(v) { }

    // explicit // if you have it!
       operator int() const { return value_; }

private:

    int value_;
};

my_enum const my_enum::value1(0);
my_enum const my_enum::value2(1);
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 除非enum-base另有指定,否则作用域枚举的基础类型是int.
  2. 允许与底层整数类型进行显式转换.但隐性转换不是.尽你所能.
  3. 由于需要两次枚举值,因此这种黑客比詹姆斯更像皮塔饼.我希望没有范围枚举支持的编译器迅速灭绝!


Jam*_*lis 5

不要使用此解决方案.请参阅霍华德接受的答案以获得更好的解决方案.我要离开这篇文章,因为霍华德的回答是指的.

如果您需要能够使用尚不支持新的,尚未标准或尚未广泛实现的语言功能的编译器来编译代码,则最好避免在代码中使用该语言功能.

这就是说,作为一个黑客的解决方法,你可以包装enum在一个struct并且使用了双隐式转换的:

struct my_enum {
    enum type { 
        value1, 
        value2 
    };

    my_enum(type v) : value_(v) { }

    operator type() const { return value_; }

private:

    type value_;
};
Run Code Online (Sandbox Code Playgroud)