C++ 在case中使用成员变量切换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
语句。我认为可以使用下面这样的全局静态变量作为常量表达式
不幸的是,编译器告诉我相反的情况:
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
的成员特别特殊?