使用枚举进行类型检查--如何正确地确定作用域 < >我有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; }
但是,这不起作用,因为通力在名称空间级别是可见的,因此它具有相互冲突的通力声明 有没有办法不在名称空间中声明枚举?还是更好的方法使用枚举进行类型检查--如何正确地确定作用域 < >我有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; },c++,enums,scope,type-safety,C++,Enums,Scope,Type Safety,但是,这不起作用,因为通力在名称空间级别是可见的,因此它具有相互冲突的通力声明 有没有办法不在名称空间中声明枚举?还是更好的方法 更新:添加了我目前正在做的事情;希望澄清我的使用案例。就最佳实践而言,我真的不确定您在这里想要实现什么,所以我无法为您指出正确的方向 但是,要直接回答您的问题:将枚举放在单独的名称空间中可以解决您的问题: namespace IntVals { enum ValueInt { kOne = 1 }; } namespace CharVals {
更新:添加了我目前正在做的事情;希望澄清我的使用案例。就最佳实践而言,我真的不确定您在这里想要实现什么,所以我无法为您指出正确的方向 但是,要直接回答您的问题:将枚举放在单独的名称空间中可以解决您的问题:
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
虽然这很难看,但我希望我能更好地理解您的意图,提供一个比这更优雅的解决方案。就最佳实践而言,我真的不确定您在这里想要实现什么,因此我无法为您指出正确的方向 但是,要直接回答您的问题:将枚举放在单独的名称空间中可以解决您的问题:
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;
有没有办法不在名称空间中声明枚举?还是更好的方法
是的,您可以按如下方式区分枚举:
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;
编译器不会抱怨
char
和int
之间的比较,因为char
是unsigned int
(或unsigned short
在某些系统上)是的,那么编译器不会抱怨第一个版本中的错误。这就是为什么我想定义枚举进行类型检查;编译器会认为ValueIt和ValueChar是不同的……是的,我正在使用你的解决方案——正如你所说的“这很难看”。所以我最初的希望是有一个更优雅的解决方案……编译器不会抱怨char
和int
之间的比较,因为char
是unsigned int
(或者unsigned short
在某些系统上)是的,然后编译器不会抱怨第一个版本中的错误。这就是为什么我想定义枚举进行类型检查;编译器会认为ValueIt和ValueChar是不同的……是的,我正在使用你的解决方案——正如你所说的“这很难看”,所以我最初的希望是有一个更优雅的解决方案…