所以,真的是一个简单的问题,如下面的例子所示。编译时,编译器会相应地(?)报告一个警告(我们正在将barfoo<int>::bar
与barfoo<foo>::bar
进行比较),现在给出bar
是一个枚举 - 我可以安全地忽略此警告吗?
#include <iostream>
using namespace std;
struct foo
{
};
template <typename bob = int>
struct barfoo
{
enum bar { ONE, TWO, THREE };
bar action() const { return TWO; }
};
template <barfoo<>::bar eAction = barfoo<>::ONE>
struct IsAction
{
template <typename bf>
static bool check(bf const& cState)
{
return cState.action() == eAction;
}
};
int main(void)
{
barfoo<foo> c;
cout << IsAction<>::check(c) << endl;
return 0;
}
鉴于我是删除警告消息的坚持者,有没有办法满足编译器而无需将枚举移到之外?
答案 0 :(得分:3)
枚举的数字表示将是相同的,因此可以直接比较它们(甚至在它们之间进行转换,尽管您可能需要通过int
来满足编译器)。如果您想要使警告静音,一种方法是在进行比较之前将它们全部投入到整数中:(int)cState.action == (int)eAction
。您可以为枚举添加一个模板operator==
来自动执行此操作 - 不过在这一点上不确定。
或者,根据您如何定义“不移动外部枚举”,您可以从用于保存枚举定义的非模板化基类派生,如http://codepad.org/8bVlcas3
答案 1 :(得分:1)
我会把它移到外面但是要移到基类:
struct barenum
{
enum bar { ONE, TWO, THREE };
protected: // because we are going to derive from it without a virtual destructor
~barenum() {}
};
template <typename bob = int>
struct barfoo : barenum
{
bar action() const { return TWO; }
};
答案 2 :(得分:0)
将枚举移动到barfoo计数的父级吗?
#include <iostream>
using namespace std;
struct foo
{
};
struct barfoobase
{
enum bar { ONE, TWO, THREE };
};
template <typename bob = int>
struct barfoo : public barfoobase
{
bar action() const { return TWO; }
};
template <barfoobase::bar eAction = barfoobase::ONE>
struct IsAction
{
template <typename bf>
static bool check(bf const& cState)
{
return cState.action() == eAction;
}
};
int main(void)
{
barfoo<foo> c;
cout << IsAction<>::check(c) << endl;
return 0;
}
编辑: 哎呀,那个答案已经发布了......