为模板参数中的每个类型声明并实现重载的虚函数

问题描述 投票:0回答:1

我为模板参数列表中的每个类型声明了一组重载的虚函数:

template<typename ... Tails>
class MessageSubscriber
{
public:
    using onMessage = void;
};

template<typename Head, typyname ... Tails>
class MessageSubscriber<Head, Tails...> : public MessageSubscriber<Tails...>
{
public:
    using MessageSubscriber<Tails...>::onMessage;
    virtual void onMessage(Head const& t) = 0;
};

然后我想在派生类中实现这些虚函数,其默认行为如下:

template<typename ...Tails>
class MessageHandler : public MessageSubscriber<Tails...>
{
public:
    //for each Type T in Tails
    void onMessage(T const& t) override
    {
        m_message_queue.enqueue(t);
    }
private:
    SomeMessageQueue<std::variant<Tails...>> m_message_queue;
};

是否可以自动生成这些实现?

c++ inheritance variadic-templates
1个回答
1
投票

我可以建议稍微改写一下代码吗?我不确定你要做什么。

template <typename Message>
class MessageSubscriber {
public:
  virtual ~MessageSubscriber() = default;
  virtual void onMessage(const Message &) = 0;
};

template <typename Handler, typename Message>
class MessageHandlerBase : public MessageSubscriber<Message> {
public:
  void onMessage(const Message &m) override {
    static_cast<Handler *>(this)->m_message_queue.enqueue(m);
  }
};

template <typename... Messages>
class MessageHandler : public MessageHandlerBase<MessageHandler<Messages...>, Messages>... {
public:
  template <typename, typename>
  friend class MessageHandlerBase;

private:
  SomeMessageQueue<std::variant<Messages...>> m_message_queue;
};

如果你保持MessageSubscriber的声明相同,你最终会遇到各种各样的问题,因为在层次结构中多次继承同一个类。

© www.soinside.com 2019 - 2024. All rights reserved.