我编写了一个消息系统,它在很大程度上依赖于编译时机制。要接收消息,您可以从类模板继承:
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宏?
我已经查看了可变参数宏,但除非为每个特定数量的参数编写特定的宏重载,否则似乎无法对它们进行评估。这种方法可行,但会限制您可以订阅的邮件数量。
是否有一种巧妙的方式来实现我想要做的事情?
答案 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;
};