是否可以使用可变参数宏来声明多重继承?

时间:2014-01-30 06:17:40

标签: c++11 macros preprocessor variadic-macros

我编写了一个消息系统,它在很大程度上依赖于编译时机制。要接收消息,您可以从类模板继承:

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 个答案:

答案 0 :(得分:2)

如何添加一组中间类:

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

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

现在你可以使用WorldRenderer<SpriteCreateMessage, SpriteMoveMessage>等来获得一个派生自所有列出类的类。

答案 1 :(得分: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;
};