在case中切换成员变量为的case语句

Switch case statement with member variable in case

本文关键字:case 语句 变量 成员      更新时间:2023-10-16

我正试图找到一种方法,在case部分使用成员变量来评估switch-case语句。我认为有一个像下面这样的全局静态变量可以作为const表达式。

不幸的是,编译器告诉我相反的情况:

error: ‘ll’ cannot appear in a constant-expression
error: ‘.’ cannot appear in a constant-expression

有什么关键词或任何东西可以让这个想法发挥作用吗?我不是C++11的专家,我听说过constexpr

enum MyEnum2 {A=0, B=1};
class Test{
    public:
        operator MyEnum2 () { return val_;}
        Test(MyEnum2 val) :val_(val) {}
        Test() {}
        static const MyEnum2 A;
        static const MyEnum2 B;
        MyEnum2 val_;
};
const MyEnum2 Test::A(MyEnum2::A);
const MyEnum2 Test::B(MyEnum2::B);
static const Test ll;
int main() {
    class Test v = ll.A;
    cout << v << endl;
    switch(v) {
        case ll.A:
            cout << "A" << endl;
            break;
        case ll.B:
            cout << "B" << endl;
            break;
    }
}

静态元素是类的一部分,而不是实例的一部分。所以你必须写:

case Test::A:

因为case表达式中的值必须是常量表达式,所以也可以使用constexpr方法如下:

class A
{
    public:
        constexpr int X() { return 42; }
};

int main()
{
    int i=42;
    A a;
    switch (i)
    {
        case a.X():
            ;
    }
}

编辑以回答问题:

您可以创建一个类的constexpr对象,该对象可以实例化为constexpr,它只需要一个constexpr构造函数,如下所示:

#include <iostream>
using namespace std;
const int i = 9;    // using a const variable as compile time const 
class Y             // using a class containing const vals
{
    public:
    int i;
    constexpr Y(int _i): i(_i){}
};
constexpr Y y(100);
int main()
{
    int var=9;
    switch (var)
    {
        case i:
            ;
        case y.i:
            ;
    }
}

但我看不到任何真正的用例用于这种编程。switch语句不能与其他实例一起"重用",因为不能为switch表达式提供其他常量"对象"以使其行为不同。所以你只是用一种非常特殊的方式隐藏你的常数值,这对其他人来说可能不太好阅读。

你能给我们你的用例吗?

只需将枚举包含在类中即可。您将获得相同的语法,枚举是定义,因此默认情况下为const。

#include <iostream>
using namespace std;
class Test {
    public:
        enum MyEnum2 {
            A,
            B
        };
        Test(Test::MyEnum2 type) {
            this->type = type;
        }
        MyEnum2 type;
};
int main() {
    Test t = Test(Test::A);
    switch (t.type) {
        case (Test::A):
            cout << "A" << endl;
            break;
        case (Test::B):
            cout << "B" << endl;
            break;
    }
}

在Test类中添加一个强制转换运算符作为运算符int(),以便Test对象的类型被强制转换为int