Применить кортеж функций к значению и вернуть кортеж

Прямо сейчас у меня есть следующее, чтобы применить две функции к значению и вернуть кортеж с 2 значениями:

template<typename F1, typename F2>
class Apply2
{
public:
using return_type = std::tuple<typename F1::return_type, typename F2::return_type>;

Apply2(const F1& f1, const F2& f2) : f1_(f1), f2_(f2) {}

template<typename T> return_type operator()(const T& t) const
{
return std::make_tuple(f1_(t), f2_(t));
}

protected:
const F1& f1_;
const F2& f2_;
};

Я хотел обобщить это на N функций:

template<typename ...F>
class ApplyN
{
public:
using return_type = std::tuple<typename F::return_type...>;

ApplyN(const std::tuple<F...>& fs) : functions_(fs) {}

template<typename T> return_type operator()(const T& t) const
{
return ???;
}

protected:
std::tuple<F...> functions_;
};

Я знаю, что мне, вероятно, нужно как-то использовать рекурсию шаблона, но я не могу обернуть голову вокруг него. Есть идеи?

6

Решение

Это заняло у меня некоторое время, но вот оно (используя индексы):

template<typename ...F>
class ApplyN
{
public:
using return_type = std::tuple<typename F::return_type...>;

ApplyN(const F&... fs) : functions_{fs...} {}

template<typename T> return_type operator()(const T& t) const
{
return with_indices(t, IndicesFor<std::tuple<F...> >{});
}

protected:
std::tuple<F...> functions_;

template <typename T, std::size_t... Indices>
return_type with_indices(const T& t, indices<Indices...>) const
{
return return_type{std::get<Indices>(functions_)(t)...};
}
};

У кого-то был (неполный) ответ раньше, но он стер его — это была моя отправная точка. В любом случае, спасибо, незнакомец! Спасибо Р. Мартиньо Фернандес тоже!

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]