C++ 中的灵活枚举
Flexible enums in C++
我如何组织枚举以便每个枚举条目都可以有参数,就像我在 Haxe 中做的那样,例如:
enum GraphicAct {
ClearScreen;
MoveTo(x:Float, y:Float);
LineTo(x:Float, y:Float);
FillColor(color:Int);
EndFill;
}
function main(){
var actions:Array<GraphicAct>;
actions.push(ClearScreen);
actions.push(FillColor(0xaaffff));
actions.push(MoveTo(100, 100));
actions.push(LineTo(200, 100));
actions.push(LineTo(100, 200));
actions.push(EndFill);
for(act in actions){
switch(act){
case ClearScreen: // do clear screen here...
case MoveTo(x, y): // move position
case LineTo(x, y): // move position
}
}
}
据我所知,C++ 仅支持不带参数的枚举条目,例如 "ClearScreen" 和 "EndFill",但在这种情况下,我如何在 C++ 中组织命令序列,就像我在示例中所做的那样使用图形命令?
为此,c++ 提供了结构和 类。 C++ 枚举是一组预定义值中的特定值。
编辑:这是一个可能的解决方案示例
class Action {
public:
doAction();
}
class ClearScreen : public class Action {
public:
doAction() {
// do something
}
}
class MoveTo : public class Action {
public:
int x, y;
doAction() {
// do something
}
}
// Etc for other things you want to do;
int main() {
std::vector<Action> Actions;
ClearScreen clr;
Actions.push_back(clr);
MoveTo move;
move.x = 100;
move.y = 100;
Actions.push_back(move);
for (Action a:Actions) {
a.doAction();
}
}
抱歉,我正在路上,无法检查代码是否真的有效,但我想你应该明白了。
您可以使用 union
和 enum
,例如:
enum class EGraphicActType
{
ClearScreen, MoveTo, LineTo, FillColorData, EnfFillData
};
struct ClearScreenData {};
struct MoveToData { float x; float y;};
struct LineToData { float x; float y;};
struct FillColorData { Int color;};
struct EnfFillData {};
struct GraphicAct {
EGraphicActType type;
union
{
ClearScreenData clearScreenData;
MoveToData moveToData;
LineToData lineToData;
FillColorData fillColorData;
EnfFillData endFillData;
} data;
};
如果您可以使用 boost,您可以使用 boost::variant
。
我如何组织枚举以便每个枚举条目都可以有参数,就像我在 Haxe 中做的那样,例如:
enum GraphicAct {
ClearScreen;
MoveTo(x:Float, y:Float);
LineTo(x:Float, y:Float);
FillColor(color:Int);
EndFill;
}
function main(){
var actions:Array<GraphicAct>;
actions.push(ClearScreen);
actions.push(FillColor(0xaaffff));
actions.push(MoveTo(100, 100));
actions.push(LineTo(200, 100));
actions.push(LineTo(100, 200));
actions.push(EndFill);
for(act in actions){
switch(act){
case ClearScreen: // do clear screen here...
case MoveTo(x, y): // move position
case LineTo(x, y): // move position
}
}
}
据我所知,C++ 仅支持不带参数的枚举条目,例如 "ClearScreen" 和 "EndFill",但在这种情况下,我如何在 C++ 中组织命令序列,就像我在示例中所做的那样使用图形命令?
为此,c++ 提供了结构和 类。 C++ 枚举是一组预定义值中的特定值。
编辑:这是一个可能的解决方案示例
class Action {
public:
doAction();
}
class ClearScreen : public class Action {
public:
doAction() {
// do something
}
}
class MoveTo : public class Action {
public:
int x, y;
doAction() {
// do something
}
}
// Etc for other things you want to do;
int main() {
std::vector<Action> Actions;
ClearScreen clr;
Actions.push_back(clr);
MoveTo move;
move.x = 100;
move.y = 100;
Actions.push_back(move);
for (Action a:Actions) {
a.doAction();
}
}
抱歉,我正在路上,无法检查代码是否真的有效,但我想你应该明白了。
您可以使用 union
和 enum
,例如:
enum class EGraphicActType
{
ClearScreen, MoveTo, LineTo, FillColorData, EnfFillData
};
struct ClearScreenData {};
struct MoveToData { float x; float y;};
struct LineToData { float x; float y;};
struct FillColorData { Int color;};
struct EnfFillData {};
struct GraphicAct {
EGraphicActType type;
union
{
ClearScreenData clearScreenData;
MoveToData moveToData;
LineToData lineToData;
FillColorData fillColorData;
EnfFillData endFillData;
} data;
};
如果您可以使用 boost,您可以使用 boost::variant
。