Я хотел взять четко определенный шаблонный класс, который зависит от boost :: signal2, и абстрагировать его на один уровень c глубже, что могло бы удалить зависимость, позволяя использовать другую реализацию, но все же позволяя более высокий уровень функции, которые будут использоваться в зависимости от более общего c интерфейса вместо более специфического c. В моем рефакторе я полностью застрял. И я уже знаю, что я немного вне своей лиги здесь. Я только начал действительно изучать C ++ в течение этого года. Но это немного весело. Но я кое-что упускаю из своего понимания шаблонов. Для начала библиотека, над которой я работаю, будет использовать C ++ 17, я использую clang ++ (Ma c) и в зависимости от Boost ~ 1.7.2 Signals2.
Рассмотрим следующее выдержки:
#include <boost/signals2.hpp>
template<typename Functional_T, typename Return_T, typename ...Args_T>
using SignalHandler = typename Functional_T::template Functional_T<Return_T(Args_T...)>;
template<typename Connection_T>
struct SignalConnection; //no issues here, just wraps a private Connection_T with a getter/setter
template<typename Connection_T, typename Functional_T, typename Return_T, typename ...Args_T>
struct ISignalEmitter
{
protected:
virtual Return_T trigger(Args_T ...args) = 0;
public:
virtual void disconnectAll() = 0;
virtual SignalConnection<Connection_T> onSignal(SignalHandler<Functional_T, Return_T, Args_T...> &signalHandler) = 0;
virtual void cancelOnSignal(const SignalConnection<Connection_T> &connection) = 0;
};
Но вот где я полностью застрял. То, что я хочу определить, на мой взгляд, выглядит так:
template<typename Return_T, typename ...Args_T>
using BoostSignals2SignalHandler = SignalHandler<boost::signals2::slot, Return_T, Args_T...>;
И я думаю, что мы все знаем, что происходит. slot
требует аргументов шаблона. Так как я могу построить это так, чтобы это работало? Я пробовал разные вещи, но я застрял. Моя следующая догадка:
template<typename Return_T, typename ...Args_T>
using BoostSignals2SignalHandler = SignalHandler<template boost::signals2::slot::template, Return_T, Args_T...>;
Мне не хочется спрашивать, но я знаю, что не могу быть первым человеком, пытающимся разгадать эту загадку. И должен быть способ думать об этих шаблонах таким образом, чтобы он был понятен, а не только предполагал и проверял. У меня есть псевдоним шаблона BoostSignals2SignalHandler
, который является специфицированной c версией SignalHandler
минус первый аргумент шаблона плюс использование существующего шаблона в качестве спецификационного аргумента шаблона c для более универсального c шаблона.
Я бы спросил: «Это плохой дизайн?», Но я чувствую, что концепция достаточна для решения проблемы, которую я хочу решить. Я просто не понимаю, что именно делать. Может кто-то указать мне верное направление? Опять ненавижу спрашивать. Это была головная боль, выясняющая. Заранее спасибо!