用于switch case的C ++ const表达式成员

时间:2014-04-10 17:22:12

标签: c++ switch-statement constexpr

我想用某种方法来评估使用非整数或eum的类成员的switch-class语句。

真正的问题是如何使这些类成员const-expression,即那些成员必须在编译时被称为常量。

我使用static const尝试了下面的代码,但只有在case语句中才有整数。

我正在寻找可以胜任这项工作的新C++11 constexpr

如果我没有该关键字,该怎么办?无论如何还是技巧或任何东西允许我的类成员(非整数或枚举)是const表达式?

我正在使用Linux和g ++。此外,任何g ++特定关键字都将受到赞赏。

  class MyEnum
  {
  public:
    int val_;
    MyEnum(){}
    MyEnum(int v): val_(v){}
    operator int(){return val_;}
    static const MyEnum ALFA;
    static const MyEnum BETA;
    void foo() {
       // do something.
    }
  };

  const MyEnum MyEnum::ALFA(1);
  const MyEnum MyEnum::BETA(2);

  void testEnum()
  {
    MyEnum val = MyEnum::ALFA;

    switch(val)
    {
      case 0: //works
      //case MyEnum::ALFA:// doesn't work
      cout << "ciao" << endl;
      break;
      case 1: //works
      //case MyEnum::BETA: // doesn't work
      cout << "bello" << endl;
      break;
      default:
      break;
    } 
  }

2 个答案:

答案 0 :(得分:1)

这似乎可以做你想要的:

#include <iostream>

enum class MyEnum { ALFA, BETA };

int main() {
    MyEnum a = MyEnum::BETA;

    switch( a ) {
        case MyEnum::ALFA:
            std::cout << "ALFA\n";
            break;
        case MyEnum::BETA:
            std::cout << "BETA\n";
            break;
    }
}

修改

根据爱德华的评论,下面是一个示例,说明如何在没有enum(在我的情况下,enum class - 创建新类型)或int的情况下实现此目的:

#include <iostream>

class MyEnum {
    struct Alfa { constexpr operator int() const { return 0; } };
    struct Beta { constexpr operator int() const { return 1; } };
    int v;
public:
    constexpr static Alfa ALFA {};
    constexpr static Beta BETA {};
    MyEnum(const MyEnum&) = default;
    constexpr MyEnum(Alfa vv): v(vv) {}
    constexpr MyEnum(Beta vv): v(vv) {}
    constexpr MyEnum() : MyEnum(ALFA) {}
    operator int () const { return v; }
};

int main() {
    MyEnum a = MyEnum::BETA;
    a = MyEnum::ALFA;

    switch( a ) {
        case MyEnum::ALFA:
            std::cout << "ALFA\n";
            break;
        case MyEnum::BETA:
            std::cout << "BETA\n";
            break;
    }
}

这要复杂得多(live here):D

答案 1 :(得分:1)

这是一种做我想你会问的事情的方法。我已修改了您的MyEnum类,使其为`constexpr,变量为val,以便它intALFABETAMyEnum的实例,而不是原始代码中的实例和成员。只是为了让事情变得有趣,演员操作员所做的不仅仅是简单地传回内部data

#include <iostream>
using namespace std;

class MyEnum
{
public:
    constexpr MyEnum(int n) : data(n) {}
    constexpr operator int(){return data+5;}
private:
    int data;
};

static constexpr MyEnum ALFA{0};
static constexpr MyEnum BETA{1};

void testEnum()
{
    int val = 5;

    switch(val)
    {
    case int(ALFA):
        cout << "ciao" << endl;
        break;
    case int(BETA):
        cout << "bello" << endl;
        break;
    default:
        break;
    } 
}

int main()
{
    testEnum();
}

按预期打印ciao