gpt4 book ai didi

c++ - 从 std::tuple 开始创建子元组

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

让我们假设一个 std::tuple<some_types...>给出。我想创建一个新的 std::tuple其类型是在 [0, sizeof...(some_types) - 2] 中索引的类型.例如,假设起始元组是 std::tuple<int, double, bool> .我想获得一个定义为 std::tuple<int, double> 的子元组.

我对可变参数模板很陌生。作为第一步,我尝试写一个 struct负责存放不同类型的原件std::tuple目的是创建一个新的同类元组(如 std::tuple<decltype(old_tuple)> new_tuple )。

template<typename... types>
struct type_list;

template<typename T, typename... types>
struct type_list<T, types...> : public type_list<types...> {
typedef T type;
};


template<typename T>
struct type_list<T> {
typedef T type;
};

我想做的是:

std::tuple<type_list<bool, double, int>::type...> new_tuple // this won't work

下一步将是丢弃参数包中的最后一个元素。如何访问多个 type存储在 type_list 中?以及如何丢弃其中的一些?

谢谢。

最佳答案

这里有一种方法可以直接解决您的问题。

template<unsigned...s> struct seq { typedef seq<s...> type; };
template<unsigned max, unsigned... s> struct make_seq:make_seq<max-1, max-1, s...> {};
template<unsigned...s> struct make_seq<0, s...>:seq<s...> {};

template<unsigned... s, typename Tuple>
auto extract_tuple( seq<s...>, Tuple& tup ) {
return std::make_tuple( std::get<s>(tup)... );
}

您可以按如下方式使用它:

std::tuple< int, double, bool > my_tup;
auto short_tup = extract_tuple( make_seq<2>(), my_tup );
auto skip_2nd = extract_tuple( seq<0,2>(), my_tup );

并使用decltype如果您需要结果类型。

一个完全不同的方法是写append_type , 它需要一个类型和一个 tuple<...> , 并将该类型添加到末尾。然后添加到type_list :

template<template<typename...>class target>
struct gather {
typedef typename type_list<types...>::template gather<target>::type parent_result;
typedef typename append< parent_result, T >::type type;
};

这为您提供了一种方法来累积 type_list 的类型进入持有template的任意参数包.但这不是您的问题所必需的。

关于c++ - 从 std::tuple<some_types...> 开始创建子元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17854219/

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