Трябва да извикам функция - шаблон или претоварена - за всеки елемент в произволен кортеж. За да бъда точен, трябва да извикам тази функция на елементите, както са посочени в кортежа.
Например. Имам кортеж 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. Как да направя това - ако е възможно, елегантно - за кортежи с произволна дължина?
РЕДАКТИРАНЕ: Благодаря момчета за отговорите! И трите са наистина ясни и обясняват проблема от всички възможни гледни точки.