Однако я получаю эту ошибку, размер ... (TSEvents), TSEvents не объявлен. Могу ли я получить доступ к TSEvents в моем вложенном шаблоне?
Краткий ответ: нет.
Длинный ответ: с
template<
template <typename TSEvent,
typename ...TSEvents> typename V,
typename... Filtered>
constexpr auto filter()
вы задали два аргумента шаблона для функции filter()
.
Первый, относящийся к списку переменных TSEvents
, является аргументом шаблона-шаблона, который получает аргумент одного или нескольких типов.
Но ваша функция не получает тип , основанный на этом шаблоне-шаблоне (с фиксированным типом TSEvent
и фиксированным TSEvents
); получить шаблон-шаблон.
Так что не имеет смысла тест size...(TSEvents)
, потому что для filter()
это не так
исправлен список TSEvents
.
Чтобы объяснить это по-другому ... вы можете вызвать фильтр таким образом
filter<std::tuple, short, int, long>();
Запрашивает sizeof...(TSEvents)
спрашивает, сколько типов содержит std::tuple
, где std::tuple
является только контейнером типов, но без содержащихся типов.
Если вы хотите выполнить какие-либо действия в функции filter()
, вам нужен параметр шаблона type , а не параметр template-template.
Проще с классами (см. Ответ AndyG), где вы можете использовать частичную специализацию (с функциями, которые вы не можете) или с функцией, когда они получают аргументы, из которых вы можете выводить типы.
Предположим, что ваш filter()
получил объект типа V<SomeTypes...>
и объект типа std::tuple<Filtered...>
, вы можете написать что-то следующим образом (осторожно: код не проверен)
template<
template <typename ...> typename V,
typename TSEvent, typename ... TSEvents, typename... Filtered>
constexpr auto filter (V<TSEvent, TSEvents...> const & v,
std::tuple<Filtered...> const & t) {
/* some code where you can use also TSEvent and TSEvents... */
}
Таким образом TSEvent
и TSEvents...
выводятся из аргумента v
.