我想用某种方法来评估使用非整数或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;
}
}
答案 0 :(得分:1)
这似乎可以做你想要的:
#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;
}
}
这要复杂得多(live here):D
答案 1 :(得分:1)
这是一种做我想你会问的事情的方法。我已修改了您的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
。