繁体   English   中英

用于switch case的C ++ const exprssion成员

[英]C++ const exprssion members for switch case

我想用某种方法来评估使用非整数或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;
    } 
  }

这似乎做你想要的:

#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;
    }
}

这要复杂得多( 住在这里 ):D

这是一种做我认为你问的事情的方法。 我已经修改了你的MyEnum类,因此它是`constexpr和变量val所以它是int ALFABETAMyEnum实例,而不是原始代码中的实例和成员。 只是为了让事情变得有趣,演员操作员所做的不仅仅是传回内部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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM