【问题标题】:Using static const class instance for a switch / case将静态 const 类实例用于 switch / case
【发布时间】: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


【解决方案1】:

case 语句的参数必须是 C++11 之前的整数常量表达式。最简单的方法是使用const int 或实际的enum。如果您使用的是 C++11,那么您可以简单地使用内置的 enum class 支持。请参阅scoped enumerations

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多