首页 > 解决方案 > 除了 C++ 中元组的最后一个组成部分之外的所有部分的算术运算

问题描述

从这个问题中获得灵感,我设法实现了一个函数,该函数将两个元组作为输入并返回一个元组,其中组件是输入中给出的元组的每个组件的最小值。

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, int> t2 {15, 15, 15}
min_tuple(t1, t2) // == {10, 15, 30}, for the last one, always keep the component of t1

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

标签: c++c++11tuplesvariadic-templatestemplate-meta-programming

解决方案


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

对于最后一个,始终保留 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)严格大于零。


推荐阅读