如何投射枚举?

Tho*_*son 5 c++ enums casting c++11

我有一个第三方无范围的枚举(我无法修改),我真的想投射到我自己的范围枚举.我怎样才能提供像转换运算符这样的东西?

我想做的是这样的事情:

#include <iostream>
enum ThirdPartyLetter {
  A=4,
  B=5
};

enum class MyNumber {
  ONE=1,
  TWO=2

  // This doesn't compile, of course
  /*Number(const ThirdPartyLetter& rhs) {
    if(rhs == ThirdPartyLetter::A) {
      return ONE;
    }
    else {
      return TWO;
    }
  }*/
};


int main() {
  ThirdPartyLetter letter = ThirdPartyLetter::A;
  MyNumber number = static_cast<MyNumber>(letter);
  // Without the cast, this prints 4 (an invalid enum value!)
  std::cout << int(number) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

有没有提供一些实物铸造的方式ThirdPartyNumberMyNumber

sky*_*ack 8

在C++编译时这样做的惯用方法是使用特征.
举个例子:

enum Foo { ONE, TWO };
enum Bar { THREE, FOUR };

template<Foo> struct conv;
template<> struct conv<Foo::ONE> { static constexpr Bar value = Bar::THREE; };
template<> struct conv<Foo::TWO> { static constexpr Bar value = Bar::FOUR; };
Run Code Online (Sandbox Code Playgroud)

如果你想在运行时这样做,也许开关很适合.
无论如何,您仍然可以使用特征来集中转换逻辑并执行以下操作:

Bar get(Foo choice) {
    switch(choice) {
    case Foo::ONE:
        return conv<ONE>::value;
     case Foo::TWO:
        return conv<TWO>::value;
    }
}
Run Code Online (Sandbox Code Playgroud)