Я использую шаблон c ++ 11 variadic, однако компилятор жалуется, что глубина создания шаблона превышает максимальную 900, код выглядит следующим образом:
template<typename F1, typename F2>
composed<F1, F2> compose(F1 f1, F2 f2) {
return composed<F1, F2>(f1, f2);
}
template<typename F1, typename F2, typename... Fs>
auto compose(F1 f1, F2 f2, Fs... fs) ->decltype(compose(compose(f1, f2), fs...)) {
return compose(compose(f1, f2), fs...);
}
Я использую этот шаблон как:
auto composed_func = compose(f1, f2, f3, f4);
Но если я изменю определение шаблона вариа на:
template<typename F1, typename F2, typename F3, typename... Fs>
auto compose(F1 f1, F2 f2, F3 f3, Fs... fs) ->decltype(compose(compose(f1, f2), f3, fs...)) {
return compose(compose(f1, f2), f3, fs...);
}
Это будет работать нормально.
Мне не ясно, почему это произошло. Мне кажется, что верхнее использование также выглядит допустимым, поскольку оно все еще рекурсивно уменьшает аргументы для вызова compose.