Мне нужно вызвать шаблонную или перегруженную функцию для каждого элемента в произвольном кортеже. Чтобы быть точным, мне нужно вызвать эту функцию для элементов, как они указаны в кортеже.
Например. У меня есть кортеж std::tuple<int, float> t{1, 2.0f};
и функционал
class Lambda{
public:
template<class T>
void operator()(T arg){ std::cout << arg << "; "; }
};
Мне нужна некоторая структура/функция Apply
, которая при вызове как Apply<Lambda, int, float>()(Lambda(), t)
даст:
1; 2.0f;
и НЕ 2.0f; 1;
.
Обратите внимание, что я знаю решение, если в функцию передается «сырой» пакет параметров, и я знаю, как это сделать для кортежей в обратном порядке. Но следующая попытка частичной специализации Apply
не удалась:
template<class Func, size_t index, class ...Components>
class ForwardsApplicator{
public:
void operator()(Func func, const std::tuple<Components...>& t){
func(std::get<index>(t));
ForwardsApplicator<Func, index + 1, Components...>()(func, t);
}
};
template<class Func, class... Components>
class ForwardsApplicator < Func, sizeof...(Components), Components... > {
public:
void operator()(Func func, const std::tuple<Components...>& t){}
};
int main{
ForwardsApplicator<Lambda, 0, int, float>()(Lambda{}, std::make_tuple(1, 2.0f));
}
Код компилируется, но печатается только первый аргумент. Однако, если я заменю специализацию ForwardsApplicator
на
template<class Func, class... Components>
class ForwardsApplicator < Func, 2, Components... >{...}
он работает корректно, но, конечно, только для кортежей длины 2. Как это сделать - если возможно, изящно - для кортежей произвольной длины?
РЕДАКТИРОВАТЬ: Спасибо, ребята, за ваши ответы! Все три очень прямолинейны и объясняют проблему со всех возможных точек зрения.