[英]C++ const exprssion members for switch case
我想用某种方法来评估使用非整数或eum类成员的switch-class语句。
真正的问题是如何使这些类成员成为const-expression
即那些成员必须在编译时被称为常量。
我用static const
尝试了下面的代码,但只有在case
语句中才有整数。
我正在寻找可以完成这项工作的新C++11 constexpr
。
如果我没有该关键字,该怎么办? 无论如何还是技巧或任何东西允许我的类成员(非整数或枚举)是const表达式?
我使用的是Linux和g ++。 此外,任何g ++特定关键字将不胜感激。
class MyEnum
{
public:
int val_;
MyEnum(){}
MyEnum(int v): val_(v){}
operator int(){return val_;}
static const MyEnum ALFA;
static const MyEnum BETA;
void foo() {
// do something.
}
};
const MyEnum MyEnum::ALFA(1);
const MyEnum MyEnum::BETA(2);
void testEnum()
{
MyEnum val = MyEnum::ALFA;
switch(val)
{
case 0: //works
//case MyEnum::ALFA:// doesn't work
cout << "ciao" << endl;
break;
case 1: //works
//case MyEnum::BETA: // doesn't work
cout << "bello" << endl;
break;
default:
break;
}
}
这似乎做你想要的:
#include <iostream>
enum class MyEnum { ALFA, BETA };
int main() {
MyEnum a = MyEnum::BETA;
switch( a ) {
case MyEnum::ALFA:
std::cout << "ALFA\n";
break;
case MyEnum::BETA:
std::cout << "BETA\n";
break;
}
}
编辑 :
根据爱德华的评论,下面,这里举例说明如何在没有enum
情况下(在我的情况下, enum class
- 创建新类型)或int
:
#include <iostream>
class MyEnum {
struct Alfa { constexpr operator int() const { return 0; } };
struct Beta { constexpr operator int() const { return 1; } };
int v;
public:
constexpr static Alfa ALFA {};
constexpr static Beta BETA {};
MyEnum(const MyEnum&) = default;
constexpr MyEnum(Alfa vv): v(vv) {}
constexpr MyEnum(Beta vv): v(vv) {}
constexpr MyEnum() : MyEnum(ALFA) {}
operator int () const { return v; }
};
int main() {
MyEnum a = MyEnum::BETA;
a = MyEnum::ALFA;
switch( a ) {
case MyEnum::ALFA:
std::cout << "ALFA\n";
break;
case MyEnum::BETA:
std::cout << "BETA\n";
break;
}
}
这要复杂得多( 住在这里 ):D
这是一种做我认为你问的事情的方法。 我已经修改了你的MyEnum
类,因此它是`constexpr
和变量val
所以它是int
。 ALFA
和BETA
是MyEnum
实例,而不是原始代码中的实例和成员。 只是为了让事情变得有趣,演员操作员所做的不仅仅是传回内部data
。
#include <iostream>
using namespace std;
class MyEnum
{
public:
constexpr MyEnum(int n) : data(n) {}
constexpr operator int(){return data+5;}
private:
int data;
};
static constexpr MyEnum ALFA{0};
static constexpr MyEnum BETA{1};
void testEnum()
{
int val = 5;
switch(val)
{
case int(ALFA):
cout << "ciao" << endl;
break;
case int(BETA):
cout << "bello" << endl;
break;
default:
break;
}
}
int main()
{
testEnum();
}
这按照预期打印ciao
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.