我怎样才能添加别名"在我不控制源的时候枚举值?

时间:2016-11-15 10:50:39

标签: c++ enums alias subclassing

(对this one的跟进问题)

我正在编写一个使用库的程序,其头文件定义了

enum foo : unsigned { first_foo, second_foo };

现在,我想为foo值添加一些别名。如果我控制了图书馆的资源,我会写:

enum foo : unsigned { 
    first_foo,
    second_foo,
    best_foo   = first_foo,
    worst_foo  = second_foo,
    oldest_foo = first_foo,
    newest_foo = second_foo; 
};

...但我不能控制来源。所以,我本来想写:

enum bar : foo { 
    best_foo   = first_foo,
    worst_foo  = second_foo,
    oldest_foo = first_foo,
    newest_foo = second_foo; 
};

但这是无效的C ++,因为foo不是整数类型。如果我尝试解决它并使用基础类型:

enum bar : std::underlying_type<foo> {  /* etc. etc. */ }

它编译,但后来 - 我没有获得foo类型的值,并且我收到有关barfoo&s之间比较的编译器警告

我可以使用static const变量:

    static const auto best_foo    = first_foo;
    static const auto worst_foo   = second_foo,
    static const auto oldest_foo  = first_foo,
    static const auto newest_foo  = second_foo; 

但我不想让他们冒险进入文字部分或符号表。

那么,我该怎么办?

1 个答案:

答案 0 :(得分:0)

你可以完全单独定义enum bar,然后重载bar和foo的一元+运算符以返回foo:

constexpr foo operator + ( bar const input )
{
    return static_cast <foo> ( input );
}

constexpr foo operator + ( foo const input )
{
    return input;
}