微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对 C++ 中元组的最后一个组件进行算术运算

如何解决对 C++ 中元组的最后一个组件进行算术运算

this question 中获得灵感,我设法实现了一个函数,该函数将两个元组作为输入并返回一个元组,其中的分量是输入中给定的元组的每个分量的最小值。

template<typename T,T...>
struct integer_sequence { };

template<std::size_t N,std::size_t... I>
struct gen_indices : gen_indices<(N - 1),(N - 1),I...> { };
template<std::size_t... I>
struct gen_indices<0,I...> : integer_sequence<std::size_t,I...> { };

template <typename ... T,std::size_t ... I>
std::tuple<T...> min_tuple_impl(
        const std::tuple<T...>& t1,const std::tuple<T...>& t2,integer_sequence<std::size_t,I...>)
{
    return { (std::min(std::get<I>(t1),std::get<I>(t2)))... };
}

template <typename ... T>
std::tuple<T...> min_tuple(
        const std::tuple<T...>& t1,const std::tuple<T...>& t2)
{
    return min_tuple_impl(t1,t2,gen_indices<sizeof...(T)>{});
}

现在,我希望它适用于除最后一个之外的所有组件。

std::tuple<int,int,int> t1 {10,20,30}
std::tuple<int,int> t2 {15,15,15}
min_tuple(t1,t2) // == {10,30},for the last one,always keep the component of t1

我怎么能在 C++11 中得到这个?

解决方法

现在,我希望它适用于除最后一个之外的所有组件。

对于最后一个,始终保留 t1 的组件

所以,为了解决这个问题,传递一个减少的整数列表(不是 sizeof...(T) 而是 sizeof...(T)-1u):

template <typename ... T>
std::tuple<T...> min_tuple(
        const std::tuple<T...>& t1,const std::tuple<T...>& t2)
{
    return min_tuple_impl(t1,t2,gen_indices<sizeof...(T)-1u>{});
} // .....................................................^^^

最后添加最后一个 t1 元素:

template <typename ... T,std::size_t ... I>
std::tuple<T...> min_tuple_impl(
        const std::tuple<T...>& t1,const std::tuple<T...>& t2,integer_sequence<std::size_t,I...>)
{
    return { (std::min(std::get<I>(t1),std::get<I>(t2)))...,std::get<sizeof...(I)>(t1) };
} // .........^^^^^^^^^^^^^^^^^^^^^^^^^^

注意:您必须确保 sizeof...(T) 严格大于零。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。