如何将模板化服务传递到 class,而不将该服务的 header 文件包含在 class header 中?

How do I pass a templated service into a class without including that service's header file in that class header?

我有一个应用程序核心中包含的输入事件模板 class。我想将 object 从核心传递到另一个 class,而不在 class 的 header 文件中包含服务的 header。

首先,这可能吗?我知道我可以使用前向声明通过 non-templated class 轻松做到这一点,但在这种情况下我认为这行不通。

此外,由于 class 使用模板识别事件的方式,无法将其抽象为基础 class。

我一直在考虑只传递一个 void 指针,然后将它强制转换为 .cpp 中的它应该是什么,但这会消除它的任何安全性。

在外面,模板是这样的:

#include "events.h"

enum class intput_events {
    toggle_overlay,
    toggle_console,
    events_count
};

template <intput_events E, typename Listener>
using event = event_t<intput_events, E, Listener>;

using InputEventListener = event_listener<intput_events,
    event<intput_events::toggle_overlay, void(int)>,
    event<intput_events::toggle_console, void(int)>>;

函数签名与匹配的枚举一起写入模板参数。

我不确定我想在这里做的事情是否可行,或者我是否对它最初的设置方式很疯狂,并试图让它按照我想要的方式工作是行不通的去锻炼。

可能我只需要处理它并把它包含进去。我想我会先问一下,如果有任何帮助或见解,我将不胜感激。

如@n.m。写道 我是个笨蛋,因为我没有尝试直接抽象它。

using InputEventListener = event_listener<intput_events,
    event<intput_events::toggle_overlay, void(int)>,
    event<intput_events::toggle_console, void(int)>>;

实际上应该是:

class InputEventListener : public event_listener<intput_events,
    event<intput_events::toggle_overlay, void()>,
    event<intput_events::toggle_console, void(int)>> {};

这很容易允许它被向前声明。