【发布时间】:2017-07-25 15:09:59
【问题描述】:
标题中的问题可能听起来微不足道,所以我最好用一些代码来解释我想要做什么......
在 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)(前提是enum class 在命名空间Y 中有一个名为FOO 的成员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) 可能会起作用,但这是我想避免的事情
【问题讨论】: