Не уверен, что понимаю (и я могу попытаться скомпилировать, потому что ваш пример слишком неполный), но мне кажется, что вы можете пройти через дополнительный параметр шаблона typename со значением по умолчанию и специализацией.
Я имею в виду ... что-то вроде
template <typename Id, Id id, typename = typename EventInfo<Id, id>::Data>
class Event;
template <typename Id, Id id, typename ... DataUnpacked>
class Event<Id, id, Pack<DataUnpacked...>>
{
// ...
public:
static void Dispatch (DataUnpacked ... data)
{
// ...
}
};
Таким образом, когда вы создаете переменную Event<EventId, EventId::someId>
, ее значение по умолчанию равно Event<EventId, EventId::someId, typename EventInfo<EventId, EventId::someId>::Data>
, то есть Event<EventId, EventId::someId, Pack<Ts...>>
для некоторого Ts...
списка переменных.
Специализация позволяет перехватывать этот список Ts...
(как DataUnpacked...
, следуя вашему примеру) и использовать его в подписи Dispatch()
.
Предложение вне темы: как заметил aschepler, выпомечены C ++ 17, чтобы вы могли использовать auto
значения шаблона;поэтому код может быть просто
template <auto id, typename = typename EventInfo<id>::Data>
class Event;
template <auto id, typename ... DataUnpacked>
class Event<id, Pack<DataUnpacked...>>
{
// ...
public:
static void Dispatch (DataUnpacked ... data)
{
// ...
}
};
, если также EventInfo
получить auto id
.