我正在尝试为元组编写转换函数,但是我找到的所有示例都将函数应用于通过引用传递的元组或使用非一元函数。
但是我想要像
这样的东西std::tuple<float, int> t(3.f, 2);
// returns std::tuple<bool, bool>:
auto r1 = transform(t, [] (auto v) { return v > decltype(v)(2); });
// returns std::tuple<float, int>:
auto r2 = transform(t, [] (auto v) { return v + decltype(v)(1); });
我得到的问题是: 是否可以确定将一元函数应用于每个元组元素的结果类型?
答案 0 :(得分:6)
让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>{});
}
C++11-compatible demo at Coliru
请注意,返回的元组将在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)))...
};
}