如何从枚举类型中获取枚举值?
how to get enum value from enum type?
标题中的问题可能听起来微不足道,所以我最好用一些代码解释我想做什么......
在 C++11 中,我可以这样做:
#include <iostream>
namespace X {
enum class FOO { A,B };
}
template <typename T> void foo(T t) {
if (t == T::A) { std::cout << "A"; }
}
int main() {
foo(X::FOO::A);
}
这里重要的一点是,模板foo
不需要知道枚举是在哪个命名空间中声明的。我也可以调用foo(Y::FOO::B)
(前提是命名空间中有一个名为FOO
的enum class
Y
具有成员A
和B
(。
现在的问题是:如何使用普通的旧枚举(并且只有 C++98 个东西(获得相同的结果?
这有效:
#include <iostream>
namespace X {
enum FOO { A,B };
}
template <typename T> void foo(T t) {
if (t == X::A) { std::cout << "A"; }
}
int main() {
foo(X::A);
}
但这只是因为foo
知道枚举是在哪个命名空间中声明的。而且它对Y::FOO::B
不起作用!(在 C++11 中,如果我用if (t == T::A) ...
替换该行,即使使用普通enum
,它也有效(
有没有办法让它在 C++98/03 中工作,而无需明确引用模板中的X
?
为了完整起见,在 C++98 中,这
template <typename T> void foo(T t) {
if (t == T::A) { std::cout << "A"; }
}
结果在
error: ‘A’ is not a member of ‘X::FOO’
PS:我不允许更改enum
,模板必须位于与enum
不同的命名空间中。
PPS:一个简单的if (t == 0)
可能会起作用,但这是我想避免的
直到 C++11 年,没有办法说"此枚举中的枚举器名称"。这就是将其添加到C++11 中的原因,甚至是无作用域枚举的原因。
为了补充Nicol Bolas的答案,您可以使用ADL破解解决方案:
namespace X {
enum FOO { A,B };
bool IsA(FOO t)
{
return t == A;
}
}
template <typename T> void foo(T t) {
if (IsA(t)) { std::cout << "An"; }
else{std::cout << "not An";}
}
现场演示
相关文章:
- 用于获取枚举值的用户输入
- 从 cin 获取 c++ 中结构中多个枚举的输入
- 给枚举一个整数,并在 C++ 中将其相关值作为字符串获取
- 重载输入 (>>) 运算符以获取枚举字符串
- 其他类中的枚举类的二传手和获取器
- 如何从枚举类型中获取枚举值?
- 如何获取枚举项的类型?
- 模板结构的多个声明,用于获取枚举,描述模板类型
- 如何获取句柄并枚举注册表路径:"REGISTRYA"?
- 在类中获取并设置枚举变量
- 获取 [枚举成员?] 的封闭类型
- 是否值得只包含type_traits以获取枚举的基础类型
- 为什么可以获取此枚举成员值,而不必先深入研究嵌套枚举
- 如何从MS Word 2007中获取枚举类型值
- C++从枚举值中获取位偏移
- 如何使用 libclang 获取枚举元素的数值?
- 在编译时获取枚举类大小,而无需定义其他元素
- 如何从boost::property_tree获取枚举
- 如何从枚举项的值中获取其名称
- 无法获取库上的枚举(未定义的引用静态元对象)