【发布时间】:2014-10-31 15:41:30
【问题描述】:
我有一个有点像枚举的类,它的每个实例都有一个唯一的 int 值,从 0 开始并在每个新实例处递增。
class MyEnumLikeClass
{
static int NextId = 0;
static const MyEnumLikeClass FIRST;
static const MyEnumLikeClass SECOND;
const int val_;
public :
MyEnumLikeClass() : val_(NextId++)
{
}
operator int() const
{
return val_;
}
//other methods (usually getters) omitted for clarity
}
我正在尝试在开关盒中使用它,以便我可以做类似的事情
MyEnumLikeClass value;
switch(value)
{
case MyEnumLikeClass::FIRST :
break;
case MyEnumLikeClass::SECOND :
break;
default :
}
我收到“case value is not a constant expression”错误,这似乎是因为编译器在编译时不知道这些值。
有什么方法可以让它工作吗?
【问题讨论】:
-
看起来您正在重新创建 C++11
enum class。您也许可以简单地使用它。 -
至少在 C++11 之前,您不能直接在对象上切换,除非它们已转换为整数类型。 (例如,您需要添加一个
operator int() const,即使这样,您也无法在 case 语句中使用这些实例,除非对象和运算符都是constexpr,为此您需要 C++11无论如何,所以...) -
“有什么方法可以让这样的事情发挥作用吗?” - 我们说话有多相似 - 当我们不知道你为什么要这样做而不是说使用实际的枚举时,很难知道什么是可以接受的......
-
对我来说没有意义。
-
@TonyD 稍微编辑了措辞。那个 switch case 例子正是我想要的工作。
标签: c++ switch-statement constants