标题中的问题可能听起来很琐碎,因此我最好用一些代码来解释我想做什么...。
在C++11中,我可以这样做:
重要的一点是模板
现在的问题是:如何使用旧式枚举(仅使用C++98)获得相同的效果?
这样做可以:
导致
在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
也可以正常工作)
是否有一种方法可以在不显式引用模板中的 X
的情况下,在C ++98/03中使其正常工作?
为了完整起见,在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)
可能会起作用,但我想避免这种情况。
T
中获取命名空间? - 463035818_is_not_a_numbervector<EnumType>
。我可以将枚举值传递给任意数量的算法,这些算法会接受该值并对其执行某些操作。但您不能将枚举值传递给一个函数,然后将其与静态枚举器进行比较。但这相当罕见;我从未遇到过这种情况。 - Nicol Bolasnamespace FOO { enum Type { A, B }; }
。 - Mark B