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

时间:2017-07-25 15:10:00

标签: c++ enums c++03

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

在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 可能会起作用,但这是我想避免的事情

2 个答案:

答案 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";}
}

Live Demo