为模板参数中的每种类型声明和实现重载虚函数
Declare and implement overloaded virtual function for each type in template arguments
我为模板参数列表中的每种类型声明了一组重载虚函数:
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;
};
然后我想在派生的 class 中实现这些虚函数,并具有如下默认行为:
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;
};
是否可以自动生成这些实现?
我可以建议对代码进行轻微修改吗?不过我不太确定你想做什么。
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
的声明不变,您最终会 运行 陷入各种问题,因为沿层次结构多次继承相同的 class。
我为模板参数列表中的每种类型声明了一组重载虚函数:
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;
};
然后我想在派生的 class 中实现这些虚函数,并具有如下默认行为:
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;
};
是否可以自动生成这些实现?
我可以建议对代码进行轻微修改吗?不过我不太确定你想做什么。
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
的声明不变,您最终会 运行 陷入各种问题,因为沿层次结构多次继承相同的 class。