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

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 中有一个名为 FOOenum class,其成员为 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 之前,没有办法说 "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