Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在case中使用成员变量切换case语句_C++_C++11_Switch Statement_Constants_Constexpr - Fatal编程技术网

C++ 在case中使用成员变量切换case语句

C++ 在case中使用成员变量切换case语句,c++,c++11,switch-statement,constants,constexpr,C++,C++11,Switch Statement,Constants,Constexpr,我试图找到一种方法,使用case部分中的成员变量计算开关-case语句。我认为可以使用下面这样的全局静态变量作为常量表达式 不幸的是,编译器告诉我相反的情况: error: ‘ll’ cannot appear in a constant-expression error: ‘.’ cannot appear in a constant-expression 是否有任何关键字或任何东西可以让这个想法发挥作用? 我不是这方面的专家,我听说过constexpr enum MyEnum2 {A=0,

我试图找到一种方法,使用case部分中的成员变量计算
开关
-
case
语句。我认为可以使用下面这样的全局静态变量作为常量表达式

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

error: ‘ll’ cannot appear in a constant-expression
error: ‘.’ cannot appear in a constant-expression
是否有任何关键字或任何东西可以让这个想法发挥作用? 我不是这方面的专家,我听说过
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;
    }
}
enum MyEnum2{A=0,B=1};
课堂测试{
公众:
运算符MyEnum2(){return val_;}
测试(myenum2val):val_u2;(val){}
Test(){}
静态常数myenum2a;
静态常数myenum2b;
髓鞘2;
};
常量MyEnum2测试::A(MyEnum2::A);
常量MyEnum2测试::B(MyEnum2::B);
静态常数测试;
int main(){
等级测试v=ll.A;

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

case Test::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:
            ;
    }
}
#包括
使用名称空间std;
const int i=9;//使用const变量作为编译时常量
类Y//使用包含常量的类
{
公众:
int i;
常量表达式Y(int_i):i(_i){
};
constexpr Y(100);
int main()
{
int-var=9;
开关(var)
{
案例一:
;
案例y.i:
;
}
}
但是我看不到这种编程的任何实际用例。switch语句不能被其他实例“重用”,因为你不能给一个switch表达式另一个常量“对象”来表现不同的行为。所以你简单地用一种非常特殊的方式隐藏你的常量值,这对其他人来说可能不太好读


你能给我们你的用例吗?

在测试类中添加一个强制转换操作符作为操作符int(),这样测试对象的类型被强制转换为int

只需将你的枚举包含在类中。你将得到相同的语法和枚举是定义,因此默认情况下为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;
    }
}
#包括
使用名称空间std;
课堂测试{
公众:
髓鞘枚举2{
A.
B
};
测试(测试:MyEnum2型){
这个->类型=类型;
}
髓鞘M2型;
};
int main(){
试验t=试验(试验::A);
开关(t型){
案例(测试::A):

为什么不简单地将枚举括在类中呢?您将得到相同的语法,枚举是定义,因此const bydefault@Jens.我可能不理解你的建议。这里的主要问题是,在这种情况下,我不能使用虚幻的“ll”。你是在建议我把MyEnum2放在课堂上,这样会起作用吗?我试过了另外,通过使用“const”变量而不是“static const”。也许我可以为全局变量“ll”做些什么?您的代码很有趣,但我仍在尝试通过使用全局变量“ll”的类成员来实现。我尝试切换到const variable,但不起作用。您知道我是否可以将这些变量设置为“constepr”以使其具有my代码工作或类似情况?请使用'constexpr operator int()'将允许在case语句中使用类对象。我需要解决一个事实,即此常量值可能作为另一个变量的成员出现。如何做到这一点?@AbruzzoforteGentile:Test
的相关成员是静态的-为什么您认为ll
的成员特别特殊?