C++11 是否可以使用可变宏来声明多重继承?

C++11 是否可以使用可变宏来声明多重继承?,c++11,macros,preprocessor,variadic-macros,C++11,Macros,Preprocessor,Variadic Macros,我已经编写了一个消息传递系统,它在很大程度上依赖于编译时机制。要接收消息,请从类模板继承,如下所示: class WorldRenderer : public fea::MessageReceiver<SpriteCreateMessage>, public fea::MessageReceiver<SpritePositionMessage>, public fea::Message

我已经编写了一个消息传递系统,它在很大程度上依赖于编译时机制。要接收消息,请从类模板继承,如下所示:

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;
};
有没有办法创建这样一个FEA_Is_接收器宏

我已经研究过可变宏,但除非为每一个特定数量的参数编写特定的宏重载,否则似乎不可能对它们求值。这种方法可以工作,但会限制您可以订阅的消息量


是否有一种简洁的方法来实现我想要做的事情?

添加一组中间类如何:

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

template <typename ...Args>
class WorldRenderer : public MiddleRenderer<Args>...
{
    // ...
};
模板
结构:T
{
无效handleMessage(常量SpriteCreateMessage和mess)覆盖
{
// ...
}
};
模板
类WorldRenderer:公共渲染器。。。
{
// ...
};

现在,您可以使用
WorldRenderer
等,获得从所有列出的类派生的类。

添加一组中间类如何:

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

template <typename ...Args>
class WorldRenderer : public MiddleRenderer<Args>...
{
    // ...
};
模板
结构:T
{
无效handleMessage(常量SpriteCreateMessage和mess)覆盖
{
// ...
}
};
模板
类WorldRenderer:公共渲染器。。。
{
// ...
};

现在,您可以使用
WorldRenderer
等,获得从所有列出的类派生的类。

添加一组中间类如何:

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

template <typename ...Args>
class WorldRenderer : public MiddleRenderer<Args>...
{
    // ...
};
模板
结构:T
{
无效handleMessage(常量SpriteCreateMessage和mess)覆盖
{
// ...
}
};
模板
类WorldRenderer:公共渲染器。。。
{
// ...
};

现在,您可以使用
WorldRenderer
等,获得从所有列出的类派生的类。

添加一组中间类如何:

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

template <typename ...Args>
class WorldRenderer : public MiddleRenderer<Args>...
{
    // ...
};
模板
结构:T
{
无效handleMessage(常量SpriteCreateMessage和mess)覆盖
{
// ...
}
};
模板
类WorldRenderer:公共渲染器。。。
{
// ...
};

现在,您可以使用
WorldRenderer
等,并获得一个从所有列出的类派生的类。

我认为您正在寻找的语法不会起作用。也许像这样的东西同样有用:

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;
};

我认为你要找的语法不起作用。也许像这样的东西同样有用:

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;
};

我认为你要找的语法不起作用。也许像这样的东西同样有用:

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;
};

我认为你要找的语法不起作用。也许像这样的东西同样有用:

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;
};

这将是一个可能的最终用户解决方案,但我的消息系统是一个库的一部分,它不知道用户将定义哪些消息类型,我正在寻找库中包含的宏。但是谢谢anyway@Tobias:看一下Boost.Preprocessor,它有一些相当高级的东西。这可能是最终用户的解决方案,但我的消息系统是库的一部分,它不知道用户将定义哪些消息类型,我正在寻找库中包含的宏。但是谢谢anyway@Tobias:看一下Boost.Preprocessor,它有一些相当高级的东西。这可能是最终用户的解决方案,但我的消息系统是库的一部分,它不知道用户将定义哪些消息类型,我正在寻找库中包含的宏。但是谢谢anyway@Tobias:看一下Boost.Preprocessor,它有一些相当高级的东西。这可能是最终用户的解决方案,但我的消息系统是库的一部分,它不知道用户将定义哪些消息类型,我正在寻找库中包含的宏。但是谢谢anyway@Tobias:看一下Boost.Preprocessor,它有一些相当先进的东西。是的,那会有用的。但在我看来,这几乎与没有宏的原始案例一样冗长,因此没有那么多意义。:)是的,那会有用的。但在我看来,这几乎与没有宏的原始案例一样冗长,因此没有那么多意义。:)是的,那会有用的。但在我看来,这几乎与没有宏的原始案例一样冗长,因此没有那么多意义。:)是的,那会有用的。但在我看来,这几乎与没有宏的原始案例一样冗长,因此没有那么多意义。:)