比较模板类的枚举 - 是否安全?

时间:2011-01-21 12:47:51

标签: c++ templates enums

所以,真的是一个简单的问题,如下面的例子所示。编译时,编译器会相应地(?)报告一个警告(我们正在将barfoo<int>::barbarfoo<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;
}

鉴于我是删除警告消息的坚持者,有没有办法满足编译器而无需将枚举移到之外?

3 个答案:

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

编辑: 哎呀,那个答案已经发布了......