gpt4 book ai didi

c++ - 对每个元组元素应用多态函数的结果类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:52 25 4
gpt4 key购买 nike

我正在尝试为元组编写转换函数,但是我发现的所有示例要么将函数应用于通过引用传递的元组元素,要么使用非一元函数。

但是我想有类似的东西

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); });

我得到的关于这个的问题是:是否可以确定将一元函数应用于每个元组元素的结果类型?

最佳答案

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)))...
};
}

关于c++ - 对每个元组元素应用多态函数的结果类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20924129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com