如何从枚举类型中获取枚举值?

how to get enum value from enum type?

本文关键字:枚举 获取 类型      更新时间:2023-10-16

标题中的问题可能听起来微不足道,所以我最好用一些代码解释我想做什么......

在 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)(前提是命名空间中有一个名为FOOenum classY具有成员AB(。

现在的问题是:如何使用普通的旧枚举(并且只有 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";}
}

现场演示