如何获取元组c++的前N个元素?

问题描述 投票:0回答:1

假设我有一个如下所示的函数,我如何获取元组的前 n 个元素?

template<std::size_t N, class... Ts>
void foo(Ts... ts){
   std::tuple<Ts...> all_elements(ts...);
   auto first_elements = //the first N elements of the tuple all_elements
}

使用

first_elements
元组的第一个
N
元素定义变量
all_elements
的最佳方法是什么?

c++ tuples variadic-templates stdtuple variadic-tuple-types
1个回答
0
投票

这是一个经典的 C++20 解决方案:使用模板闭包,结合

std::integer_sequence

让我们通过使用通用引用和转发元组来稍微改进一下,以最大限度地减少副本数量。

以下示例不是定义元组,而是将第一个

N
参数转发给另一个函数。

纯属巧合,所讨论的函数是

std::make_tuple
...生成一个元组。但是,任何功能都可以。

#include <tuple>
#include <utility>
#include <iostream>
#include <type_traits>

template<std::size_t N, typename ...Ts>
auto foo(Ts && ...ts)
{
    auto all_elements=std::forward_as_tuple(
        std::forward<Ts>(ts)...
    );

    return [&]<std::size_t ...I>(std::index_sequence<I...>)
        {
            return std::make_tuple(std::get<I>(all_elements)...);
        }(
            std::make_index_sequence<N>{}
        );
}

int main()
{
    auto t=foo<2>(3, "a", 0.1);

    static_assert(std::is_same_v<decltype(t), std::tuple<int, const char*>>);

    std::cout << std::get<0>(t) << " " << std::get<1>(t) << "\n";
}

(现场演示)

© www.soinside.com 2019 - 2024. All rights reserved.