我有一个第三方无范围的枚举(我无法修改),我想将其强制转换为自己的作用域枚举。如何提供类似转换运算符的内容?
我想做的是这样的:
#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;
}
有没有一种方法可以提供从
ThirdPartyNumber
到MyNumber
的转换? 最佳答案
在C++中的编译时,惯用的方式是使用traits。
举个例子:
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; };
如果要在运行时执行此操作,则可能很适合使用开关。
无论如何,您仍然可以使用特征来集中转换逻辑并执行以下操作:
Bar get(Foo choice) {
switch(choice) {
case Foo::ONE:
return conv<ONE>::value;
case Foo::TWO:
return conv<TWO>::value;
}
}
关于c++ - 如何进行枚举?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41527235/