如何从元组中删除第n个元素?

真纪

我正在尝试编写一个函数,该函数std::tuple从现有的函数创建一个新函数,并跳过给定索引上的元素。例如:

我有一个元组t定义如下:

constexpr auto t = std::tuple(1, 2, 3, 4);

我想将其复制到另一个元组。但是,我想跳过第n个元素。假设在这种情况下,我要跳过第n个元素为3(这意味着我要跳过索引为2的元素)。这将导致一个新的元组定义为:

std::tuple(1, 2, 4);

这是到目前为止我得到的最接近的东西:

template<std::size_t N, typename T, std::size_t ... is>
constexpr auto fun(T&& tp, std::index_sequence<is...>&& i) noexcept {
    return std::tuple((is != N ? std::get<is>(tp) : 0) ...);
}

template<std::size_t N, std::size_t... elems>
constexpr auto fun2() noexcept {
    constexpr auto t = std::tuple(elems...);
    return fun<N>(std::forward_as_tuple(elems...), std::make_index_sequence<sizeof...(elems)>());
}

但是,我没有删除第n个元素,而是将其设置为0。

理想情况下,我将在函数中更改return参数以fun()使用多个临时元组创建一个新的元组:

return std::tuple_cat((is != N ? std::tuple(std::get<is>(tp)) : std::tuple()) ...);

但是,这样做的问题是三元运算符必须在两侧都具有匹配类型。

我尝试的另一种方法是基于递归:

template<std::size_t N, std::size_t head, std::size_t... tail>
constexpr auto fun3() noexcept {
    if constexpr(!sizeof...(tail))
        return std::tuple(head);

    if constexpr(sizeof...(tail) - 1 == N)
        return std::tuple_cat(fun3<N, tail...>());

    if constexpr(sizeof...(tail) - 1 != N)
        return std::tuple_cat(std::tuple(head), fun3<N, tail...>());
}

但是,这更加不成功。在这种情况下,如果N等于0,则第n个元素(这里也是第一个元素)仍将在新元组中使用。另外,它甚至不会编译,因为第二条语句存在问题:

if constexpr(sizeof...(tail) - 1 == N)

我在这里想念什么?如何复制元组并在复制过程中跳过其元素之一?

我正在使用C ++ 17,我需要在编译时评估函数。

最高66

关于什么

return std::tuple_cat( foo<is, N>::func(std::get<is>(tp)) ...);

foo具有以下专门化的结构在哪里

template <std::size_t, std::size_t>
struct foo
 {
   template <typename T>
   static auto func (T const & t)
    { return std::make_tuple(t); } 
 }

template <std::size_t N>
struct foo<N, N>
 {
   template <typename T>
   static std::tuple<> func (T const &)
    { return {}; } 
 }

(警告:代码未经测试)。

这几乎是您的三元运算符的主意,但没有在两侧匹配类型的问题:仅实例化正确的类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Haskell元组中访问第n个元素

来自分类Dev

如何在Haskell元组中访问第n个元素

来自分类Dev

在Fortran中,如何从数组中删除第N个元素?

来自分类Dev

OCaml:提取元组的第n个元素?

来自分类Dev

如何在numpy数组中的所有numpy数组中删除第n个元素?

来自分类Dev

如何在numpy数组中的所有numpy数组中删除第n个元素?

来自分类Dev

如何从数组末尾删除第n个元素

来自分类Dev

如何删除吗啡数组的第n个元素

来自分类Dev

如何分割字符串并删除第n个元素?

来自分类Dev

如何使用 foldl 删除列表的第 n 个元素?

来自分类Dev

Python删除数组中的每个第n个元素

来自分类Dev

根据第n个元素删除列表中的列表

来自分类Dev

从数组中删除第n个元素并对其重新索引

来自分类Dev

从数组(char *)中删除第n个元素

来自分类Dev

从swift数组中删除每个第n个元素

来自分类Dev

jQuery从元素中删除第n个类

来自分类Dev

在输入向量的笛卡尔积中创建第n个元素的元组

来自分类Dev

从 Pandas Python 中的命名元组列表中提取第 n 个元素?

来自分类Dev

如何从列表中的每个元素都是元组的列表中获取元组第 0 个索引处的最大值?

来自分类Dev

删除列表的第n个元素

来自分类Dev

Scala:从元组数组/ RDD获取第n个元素的和

来自分类Dev

从ArrayList中删除第ith个元素

来自分类Dev

从ArrayList中删除第ith个元素

来自分类Dev

如何在PHP中访问数组的第N个元素

来自分类Dev

如何同时在列表中打印第n个元素?

来自分类Dev

如何在JavaScript中获取数组的第n个元素?

来自分类Dev

如何使列表中的第n个元素成为自己的列表?

来自分类Dev

如何从元组列表中删除元素?

来自分类Dev

如何从使用元组的字典中删除元素

Related 相关文章

  1. 1

    如何在Haskell元组中访问第n个元素

  2. 2

    如何在Haskell元组中访问第n个元素

  3. 3

    在Fortran中,如何从数组中删除第N个元素?

  4. 4

    OCaml:提取元组的第n个元素?

  5. 5

    如何在numpy数组中的所有numpy数组中删除第n个元素?

  6. 6

    如何在numpy数组中的所有numpy数组中删除第n个元素?

  7. 7

    如何从数组末尾删除第n个元素

  8. 8

    如何删除吗啡数组的第n个元素

  9. 9

    如何分割字符串并删除第n个元素?

  10. 10

    如何使用 foldl 删除列表的第 n 个元素?

  11. 11

    Python删除数组中的每个第n个元素

  12. 12

    根据第n个元素删除列表中的列表

  13. 13

    从数组中删除第n个元素并对其重新索引

  14. 14

    从数组(char *)中删除第n个元素

  15. 15

    从swift数组中删除每个第n个元素

  16. 16

    jQuery从元素中删除第n个类

  17. 17

    在输入向量的笛卡尔积中创建第n个元素的元组

  18. 18

    从 Pandas Python 中的命名元组列表中提取第 n 个元素?

  19. 19

    如何从列表中的每个元素都是元组的列表中获取元组第 0 个索引处的最大值?

  20. 20

    删除列表的第n个元素

  21. 21

    Scala:从元组数组/ RDD获取第n个元素的和

  22. 22

    从ArrayList中删除第ith个元素

  23. 23

    从ArrayList中删除第ith个元素

  24. 24

    如何在PHP中访问数组的第N个元素

  25. 25

    如何同时在列表中打印第n个元素?

  26. 26

    如何在JavaScript中获取数组的第n个元素?

  27. 27

    如何使列表中的第n个元素成为自己的列表?

  28. 28

    如何从元组列表中删除元素?

  29. 29

    如何从使用元组的字典中删除元素

热门标签

归档