На данный момент это позволяет мне регистрировать функции слотов с одним аргументом (int, double или bool - соответственно).Мне нужно что-то похожее на:
ISignalStorage<SignalA, <int, double, bool>, <int, int>, <const char*>> iss;
Как лучше объяснил Сэм Варшавчик, этот тип потребностей обычно управляется упаковкой пакетов типов в качестве аргументов шаблона длядругой класс.Обычно используется std::tuple
, который предлагает несколько удобных инструментов для управления пакетом типов, но вы также можете определить тривиальный шаблонный класс / структуру следующим образом (TW
для "оболочки типа")
template <typename...>
struct TW
{ };
Я предлагаю немного другое решение, которое является нейтральным по отношению к оболочке (так что вы можете использовать с классическим std::tuple
, с пользовательским TW
или также смешивая их)
template <typename, typename>
struct ISignalStorageHelper;
template <typename T, template <typename...> class C, typename ... Ts>
struct ISignalStorageHelper<T, C<Ts...>> : public ISignalMap<T, Ts...>
{ };
template <typename SignalDispatcherClass, typename ... Tuples>
class ISignalStorage
: public ISignalStorageHelper<SignalDispatcherClass, Tuples>...
{ };
Таким образом, мы можем избежать using
извлечь type
внутри промежуточной структуры, но ISignalStorage
наследовать также от ISignalStorageHelper
структур (надеюсь, это не проблема).
Вы можете определить ISignalStorage
объекты, используя кортежи
ISignalStorage<foo, std::tuple<int, double>, std::tuple<double, int>> a;
Упаковка на заказ как TW
ISignalStorage<foo, TW<int, double>, TW<double, int>> a;
или также смешивание
ISignalStorage<foo, std::tuple<int, double>, TW<double, int>> a;