标题中的问题可能听起来微不足道,所以我最好用一些代码解释我想做什么......
在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
名为FOO
的名为Y
的名称空间A
,其成员为B
和#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);
}
。
现在的问题是:如何使用普通的旧枚举(只有C ++ 98的东西)?
这有效:
foo
但只是因为Y::FOO::B
知道枚举声明的名称空间。它不适用于if (t == T::A) ...
! (在C ++ 11中,如果我用enum
替换行,它也可以工作,即使是普通的X
)
有没有办法让这个在C ++ 98/03中工作而不明确地在模板中引用template <typename T> void foo(T t) {
if (t == T::A) { std::cout << "A"; }
}
?
为了完整起见,在C ++ 98中,这个
error: ‘A’ is not a member of ‘X::FOO’
结果
enum
PS:我不允许更改enum
,模板必须位于与if (t == 0)
不同的名称空间中。
PPS:一个简单的echo $VAR , $VARB , $VARC >> ~/servers.csv
可能会起作用,但这是我想避免的事情
答案 0 :(得分:6)
在C ++ 11之前,没有办法说“此枚举中的枚举器名称”。那是为什么它被添加到C ++ 11中,甚至是未编译的枚举。
答案 1 :(得分:3)
要添加到Nicol Bolas' answer,您可以使用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";}
}