2011-05-05 38 views
1

我有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; 
}; 

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

有没有办法在命名空间中声明枚举?或者更好的方法在这里?

已更新:增加了我目前所做的;希望澄清我的用例。

+0

编译器不会抱怨'char'和'INT之间的比较'因为'char'是一个'unsigned int'(或者在某些系统上是'unsigned short') – Chad 2011-05-05 20:35:35

+0

是的,那么编译器不会抱怨第一个版本中的错误。这就是为什么我想定义枚举来进行类型检查的原因;编译器会认为ValueInt和ValueChar是不同的... – hrr 2011-05-06 02:29:24

+0

看我的解决方案然后 – Chad 2011-05-06 02:40:48

回答

3

就最佳实践而言,我真的不确定你在这里试图完成什么,所以我不能指出你在正确的方向。

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

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 

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

1

有没有办法在命名空间中声明枚举?或者更好的方法在这里?

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

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;