如何从枚举类型中获取枚举值?
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)
(前提是在命名空间 Y
中有一个名为 FOO
的 enum class
,其成员为 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 之前,没有办法说 "the enumerator name within this enumeration"。这就是 为什么 它被添加到 C++11 中,甚至添加到无作用域枚举中。
添加到, you can kind of hack your way to a solution using 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 << "A\n"; }
else{std::cout << "not A\n";}
}
Live Demo
标题中的问题可能听起来微不足道,所以我最好用一些代码来解释我想做什么...
在 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)
(前提是在命名空间 Y
中有一个名为 FOO
的 enum class
,其成员为 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 之前,没有办法说 "the enumerator name within this enumeration"。这就是 为什么 它被添加到 C++11 中,甚至添加到无作用域枚举中。
添加到
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 << "A\n"; }
else{std::cout << "not A\n";}
}