使用枚举进行类型检查——如何正确确定作用域



我有一个c++类的混合,其中一些存储状态变量0..9作为整数,其他使用'0'…"9"。目前是:

enum { kOne = '1' };
class StoresValueAsInt {
    static int value;  // contains 0 ... 9
};
class StoresValueAsChar {
    static char value; // contains '0' ... '9'
};
class StoresValueAsChar {
    static char value;
};
template <typename X>
isOne() { return X::value == kOne; }

这允许我编写错误的代码isOne<StoresValueAsInt::value>()。相反,我想让编译器抱怨这种不正确的用法。我尝试了以下操作:

enum ValueInt {
    kOne = 1
};
enum ValueChar {
    kOne = '1'
};
class StoresValueAsInt {
    static ValueInt value;
};
class StoresValueAsChar {
    static ValueChar value;
};
class StoresValueAsChar2 {
    static ValueChar value;
};

然而,这不起作用,因为通力在命名空间级别是可见的,因此它有冲突的通力声明。

是否有办法不在命名空间中声明枚举?或者有更好的方法?

updated:添加了我目前所做的;希望澄清我的用例

就最佳实践而言,我真的不确定您在这里想要完成什么,所以我无法为您指出正确的方向。

但是,直接回答您的问题:将枚举放在单独的命名空间中将解决您的问题:

namespace IntVals {
   enum ValueInt {
      kOne = 1
   };
}
namespace CharVals {
   enum ValueChar {
      kOne = '1'
   };
}
class StoresValueAsInt {
   static ValueInt value;
};
class StoresValueAsChar {
   static ValueChar value;
};

那么你应该能够使用以下语句:

StoresValueAsInt::value == CharVals::kOne

虽然这是丑陋的,我希望我能更好地理解你想要提供一个比这更优雅的解决方案。

是否有办法不在命名空间中声明枚举?或者有更好的方法?

是的,你可以区分你的枚举如下:

struct ValueInt {
  enum {  // no need to have enum Name
    kOne = 1
  };
};
struct ValueChar {
  enum {  // no need to have enum Name
    kOne = '1'
  };
};

用法:

ValueInt::kOne;
ValueChar::kOne;

相关内容

  • 没有找到相关文章

最新更新