Я нашел одно решение. Оберните каждый пакет параметров в кортеж. Используйте структуру для частичной специализации. Вот демонстрация, которая передает аргументы функтору, используя один кортеж в виде списка и накапливая другой. Ну, этот пересылает путем копирования. Кортежи используются при выводе типов, но никакие кортежи не используются в параметрах функций, что, я думаю, является правильным.
#include <iostream>
#include <tuple>
template < typename ... >
struct two_impl {};
// Base case
template < typename F,
typename ...Bs >
struct two_impl < F, std::tuple <>, std::tuple< Bs... > > {
void operator()(F f, Bs... bs) {
f(bs...);
}
};
// Recursive case
template < typename F,
typename A,
typename ...As,
typename ...Bs >
struct two_impl < F, std::tuple< A, As... >, std::tuple< Bs...> > {
void operator()(F f, A a, As... as, Bs... bs) {
auto impl = two_impl < F, std::tuple < As... >, std::tuple < Bs..., A> >();
impl(f, as..., bs..., a);
}
};
template < typename F, typename ...Ts >
void two(F f, Ts ...ts) {
auto impl = two_impl< F, std::tuple < Ts... >, std::tuple <> >();
impl(f, ts...);
}
struct Test {
void operator()(int i, float f, double d) {
std::cout << i << std::endl << f << std::endl << d << std::endl;
}
};
int main () {
two(Test(), 1, 1.5f, 2.1);
}
Кортежи - очень хороший список времени компиляции.