使用成员变量切换case语句以防万一

时间:2014-04-10 22:23:31

标签: c++ c++11 switch-statement const constexpr

我正在尝试使用案例部分中的成员变量来查找评估switch - case语句的方法。我认为有一个像下面这样的全局静态变量将被允许作为const-expression。

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

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

3 个答案:

答案 0 :(得分:4)

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

case Test::A:

因为case表达式中的值必须是常量表达式,所以您也可以使用a 像这样的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语句不能被重用&#34;与另一个实例,因为你不能给一个开关表达式另一个&#34;对象&#34;常数表现不同。因此,您可以通过一种非常特殊的方式隐藏您的常量值,这对其他人来说可能不太好看。

你能告诉我们你的用例吗?

答案 1 :(得分:1)

只需将您的枚举括在课堂中即可。您将获得相同的语法,枚举是定义,因此默认为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;
    }
}

答案 2 :(得分:0)

在Test类中添加一个强制转换操作符作为operator int(),以便Test对象获取类型转换为int