Как передать шаблонную службу в класс, не включая файл заголовка этой службы в заголовок этого класса? - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть шаблонный класс для входных событий, который включен в ядро ​​приложения.Я хочу передать объект из ядра в другой класс без включения заголовка службы в файл заголовка класса.

Во-первых, возможно ли это вообще?Я знаю, что могу легко сделать это с не шаблонным классом, используя предварительное объявление, но в этом случае я не думаю, что это сработает.

Кроме того, из-за того, как класс работает с идентификацией событий с использованием шаблонов, это не может быть абстрагировано в базовый класс.

Я рассматривал просто передачу пустого указателя и приведение его в .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)>>;

Где сигнатуры функций записываются в параметры шаблона с соответствующим перечислением.

Я не уверен, возможно ли то, что я хочу сделать здесь, или если я 'Я безумен из-за того, как он настроен в первую очередь, и попытаться заставить его работать так, как я хочу, не получится.

Может быть, мне просто нужно разобраться с этим и поставитьВключение. Я решил, что сначала спрошу, и я был бы признателен за любую помощь или понимание.

1 Ответ

0 голосов
/ 08 апреля 2019

Как что @ 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)>> {};

Который мог бы легко объявить его вперед.

...