如何将模板化服务传递到 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)>> {};
这很容易允许它被向前声明。
我有一个应用程序核心中包含的输入事件模板 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)>> {};
这很容易允许它被向前声明。