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 宏?

我研究了可变参数宏,但似乎无法评估它们,除非您为每个特定数量的参数编写特定的宏重载。这种方法可行,但会限制您可以订阅的消息数量。

有没有一种巧妙的方法来实现我想要做的事情?

4

2 回答 2

2

如何添加一组中间类:

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

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

现在您可以使用WorldRenderer<SpriteCreateMessage, SpriteMoveMessage>etc. 并获得一个派生自所有列出的类的类。

于 2014-01-30T06:24:18.137 回答
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;
};
于 2014-01-30T06:24:21.527 回答