簡體   English   中英

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 ++中組織命令序列?

您可以使用unionenum ,例如:

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

為此,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();
 }
}

抱歉,我只是在路上,無法檢查代碼是否真的有效,但是我認為您應該明白這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM