我正在尝试为元组编写转换函数,但是我发现的所有示例都将函数应用于通过引用传递的元组或使用非一元函数.
但是,我希望有类似的东西
std::tuplet(3.f, 2); // returns std::tuple : auto r1 = transform(t, [] (auto v) { return v > decltype(v)(2); }); // returns std::tuple : auto r2 = transform(t, [] (auto v) { return v + decltype(v)(1); });
我得到的问题是:是否有可能确定将一元函数应用于每个元组元素的结果类型?
让我们std::make_tuple
为你做类型推断.您需要一个index_sequence
包扩展来构建make_tuple
调用:
template <typename T, typename F, std::size_t... I> auto tmap(T&& t, F&& f, std::index_sequence<I...>) { return std::make_tuple(f(std::get<I>(std::forward<T>(t)))...); } template <typename T, typename F> auto tmap(T&& t, F&& f) { return tmap(std::forward<T>(t), std::forward<F>(f), std::make_index_sequence< std::tuple_size< typename std::decay<T>::type >::value>{}); }
Coliru的C++ 11兼容演示.
请注意,返回的元组将在f
返回引用类型时存储值.如果您确实想存储引用,则需要更复杂的辅助函数:
template <typename T, typename F, std::size_t... I> auto tmap(T&& t, F&& f, std::index_sequence<I...>) { return std::tuple<decltype(f(std::get<I>(std::forward<T>(t))))...>{ f(std::get<I>(std::forward<T>(t)))... }; }