我正在尝试使用案例部分中的成员变量来查找评估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;
}
}
答案 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