В коде вашего примера вы используете сворачивание шаблонов, новую функцию C ++ 17, которая позволяет вам избежать рекурсии.
Но, чтобы избежать конфликта имен, я предлагаю вызватьбазовая версия по-другому;скажем do_something()
template<typename Module>
void do_something() {
// BASE FUNCTION
// Do something
}
template<typename... Modules>
void init() {
(do_something<Modules>(), ...);
}
Если вы действительно хотите использовать рекурсивный способ, вы можете сделать что-то следующим образом
template <int = 0>
void init ()
{
// stop recursion; do nothing
}
template <typename Head, typename ... Tail>
void init ()
{
// do something with Head
// recursively call init()
init<Tail...>();
}
Хитрость заключается в том, что вызов init<Tail...>();
, пока Tail...
нет'empty' называется рекурсивной версией Head
/ Tail...
.
Когда Tail...
пусто, init<Tail...>()
равно init<>()
, поэтому версия Head
/ Tail...
не соответствуетбольше (нет Head
), но соответствует версии int = 0
;так что init<>()
становится init<0>()
, и случай бездействия останавливает рекурсию.