2014-01-30 102 views
0

我寫了一個消息系統,它依賴於編譯時機制。要接收郵件,您從一個類繼承模板,像這樣:是否可以使用可變宏來聲明多重繼承?

class WorldRenderer : public fea::MessageReceiver<SpriteCreateMessage>, 
         public fea::MessageReceiver<SpritePositionMessage>, 
         public fea::MessageReceiver<SpriteMoveMessage> 
{ 
public: 
    void handleMessage(const SpriteCreateMessage& mess) override; 
    void handleMessage(const SpritePositionMessage& mess) override; 
    void handleMessage(const SpriteMoveMessage& mess) override; 
}; 

我想這有在使用宏一種巧妙的方法速記這個符號的方式。我如何想象所說的宏將被使用:

class WorldRenderer 
FEA_IS_RECEIVER(SpriteCreateMessage, SpritePositionMessage, SpriteMoveMessage) 
{ 
public: 
    void handleMessage(const SpriteCreateMessage& mess) override; 
    void handleMessage(const SpritePositionMessage& mess) override; 
    void handleMessage(const SpriteMoveMessage& mess) override; 
}; 

有沒有辦法創建這樣的FEA_IS_RECEIVER宏?

我已經研究了可變宏,但似乎不可能評估它們,除非您爲每個特定數量的參數編寫特定的宏重載。這種方法可行,但會限制您可以訂閱的消息數量。

是否有一個完美的方式來實現我想要做的事情?

回答

2

如何增加一箇中間的一組類:

template <typename T> 
struct MiddleRenderer : T 
{ 
    void handleMessage(const SpriteCreateMessage& mess) override 
    { 
     // ... 
    } 
}; 

template <typename ...Args> 
class WorldRenderer : public MiddleRenderer<Args>... 
{ 
    // ... 
}; 

現在你可以使用WorldRenderer<SpriteCreateMessage, SpriteMoveMessage>等,並獲取從所有列出的類派生的類。

+0

這將是一個可能的最終用戶的解決方案,但我的信息系統是不知道哪個消息類型將通過用戶定義庫中的一部分,我正在尋找一個宏包括在圖書館。但是,無論如何感謝 – Tobias

+0

@Tobias:看看Boost.Preprocessor,它有一些相當先進的東西。 –

1

我不認爲你正在尋找的語法正常工作。也許這樣的事情也同樣可用:

class WorldRenderer : 
    FEA_IS_RECEIVER(SpriteCreateMessage), 
    FEA_IS_RECEIVER(SpritePositionMessage), 
    FEA_IS_RECEIVER(SpriteMoveMessage) 
{ 
public: 
    void handleMessage(const SpriteCreateMessage& mess) override; 
    void handleMessage(const SpritePositionMessage& mess) override; 
    void handleMessage(const SpriteMoveMessage& mess) override; 
}; 
+0

是的,這將工作。但海事組織幾乎和沒有宏觀的原始案例一樣冗長,所以沒有多少意義。 :) – Tobias

相關問題