我有一个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;