Вот доказательство концепции, вы можете лучше адаптировать ее для своих нужд. Я определил mapper как функцию.
template <typename T>
std::vector<T> helper(std::vector<T> vec) {
return vec;
}
template <typename T, typename Fun>
std::vector<T> helper(std::vector<T> vec, Fun fun) {
std::vector<T> result;
for (const auto& v : vec) {
result.emplace_back(fun(v));
}
return result;
}
template <typename T, typename Fun, typename... Funs>
std::vector<T> helper(std::vector<T> vec, Fun fun, Funs... funs) {
return helper(helper(vec, funs...), fun);
}
template <typename T, typename... Funs>
std::vector<T> mapper(std::vector<T> vec, Funs... funs) {
return helper(vec, funs...);
}
int main() {
auto result = mapper(
std::vector<int>{1, 2, 3},
[](auto v) { return v * v; },
[](auto v) { return 2 * v; },
[](auto v) { return v + 1; });
for (const auto& v : result) {
std::cout << v << std::endl;
}
}
Примечание: если вам нужен другой заказ, замените
return helper(helper(vec, funs...), fun);
на:
return helper(helper(vec, fun), funs...);