如何将一个任意数量的输入输出参数旋转到一个函数?

用户12547645

Input: 1, 2, 3, 4

Output: 2, 3, 4, 1

我的解决方案: 玩我的代码

template <typename T, typename ... Param>
void rotate(T* first, Param* ... params) {
    std::vector<T*> tmp = {first, params...};
    if (tmp.size() <= 1) {return;}
    T f = *first;
    for (size_t i = 1; i < tmp.size(); ++i) {
        *tmp.at(i - 1) = *tmp.at(i);
    }
    *tmp.at(tmp.size() - 1) = f;
}

我想如上所述旋转任意数量的元素。我的解决方案似乎有效,但是在我看来,这不是很“优雅”。我不喜欢在这里初始化向量。没有向量,有没有办法完成同一件事?也许有递归?

理想情况下,我还要传递引用而不是指针。

慈济

这是一个不使用的INCORRECT解决方案std::vector,其中所有参数均通过引用传递,并且仅需要复制一个元素:

// THIS IS WRONG, SEE EDIT BELOW

template<typename T, typename ...Ts>
void rotate(T& first, Ts& ...rest) 
{
   auto first_copy = first; 
   std::tie(first, rest...) = {rest..., first_copy};
}

这是一个演示


编辑:上面的解决方案是优雅,但不正确,因为似乎std::tuple未指定分配给成员的顺序上面的代码依赖于std::tie要从左到右完成的参数分配,因此该解决方案不起作用。

这是使用的更详细的解决方案std::apply,可以保证按顺序调用传入的元组的参数:

template<typename T, typename ...Ts>
void rotate(T& first, Ts& ...rest) 
{
    auto first_copy = first;

    std::apply([&](auto&... lhs) {
        std::apply([&](auto&... rhs) {
            ((lhs = std::move(rhs)), ...); 
        }, std::tuple<T&, Ts&...>{rest..., first_copy});
    }, std::tuple<T&, Ts&...>{first, rest...});
}

尽管这比较冗长,但与第一个解决方案不同,它第一个执行1个复制构造和N个复制分配,但该解决方案的优点是仅执行1个复制构造和N个移动分配。据我所知,第一种解决方案是不可能的。显然,这是正确的,这也是一个很大的优势:)

这是一个演示,还显示了所做的复制/移动。


这是@ max66提供的甚至更简单的解决方案,它与以下解决方案一样有效std::apply

template<typename T, typename ...Ts>
void rotate(T& first, Ts& ...rest) 
{
  T first_copy{first}; 

  [&](auto& first_ref, auto & ... rest_ref) { 
      first = std::move(first_ref);
      (..., (rest = std::move(rest_ref))); 
  } (rest..., first_copy);
}

这是一个演示

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将精灵旋转到一个点?

来自分类Dev

如何将一个函数的输出值用作另一个MATLAB的输入

来自分类Dev

如何将一个对象的局部轴旋转到另一个对象?

来自分类Dev

将具有任意数量参数的任何函数传递给另一个函数

来自分类Dev

如何使用数组从一个输入输出多个值?

来自分类Dev

(Java-LibGDX)如何将向量旋转到围绕另一个向量的特定旋转

来自分类Dev

不确定如何将一个功能的输出输入为另一功能的输入

来自分类Dev

如何创建一个可以根据输入参数任意多次分割字符串的函数?

来自分类Dev

如何创建一个可以根据输入参数任意多次拆分字符串的函数?

来自分类Dev

如何将一个cshtml页面跳转到另一个cshtml?

来自分类Dev

如何将一个模块的输出信号连接到另一模块的输入信号

来自分类Dev

向量将最后一个内容旋转到开头

来自分类Dev

如何将一个DataFlow任务的输出用作另一个DataFlow任务的输入?

来自分类Dev

如何将一个sparql查询的输出作为输入传递给另一个sparql查询

来自分类Dev

如何将一个回声的输出传递给另一个回声的输入?

来自分类Dev

平滑旋转到一个角度

来自分类Dev

平滑旋转到一个角度

来自分类Dev

传递一个接受任意数量和类型参数的函数作为类模板参数

来自分类Dev

如何将一个过程的输出作为参数传递给 tcl 中的另一个过程

来自分类Dev

如何将一个函数作为参数传递给另一个函数

来自分类Dev

R-如何将一个函数作为参数传递给另一个函数?

来自分类Dev

如何将参数从一个函数发送到另一个函数

来自分类Dev

如何将参数从一个函数传递到另一个函数

来自分类Dev

如何将参数传递给作为另一个函数参数的函数

来自分类Dev

ThreeJS:如何将一个对象的旋转克隆到另一个

来自分类Dev

以任意数量的另一个函数作为参数的函数

来自分类Dev

如何将一个命令的输出除以另一个命令的输出?

来自分类Dev

从具有相同输入和输出数量的另一个函数中调用一个函数

来自分类Dev

如何将函数输出传递给另一个函数

Related 相关文章

  1. 1

    如何将精灵旋转到一个点?

  2. 2

    如何将一个函数的输出值用作另一个MATLAB的输入

  3. 3

    如何将一个对象的局部轴旋转到另一个对象?

  4. 4

    将具有任意数量参数的任何函数传递给另一个函数

  5. 5

    如何使用数组从一个输入输出多个值?

  6. 6

    (Java-LibGDX)如何将向量旋转到围绕另一个向量的特定旋转

  7. 7

    不确定如何将一个功能的输出输入为另一功能的输入

  8. 8

    如何创建一个可以根据输入参数任意多次分割字符串的函数?

  9. 9

    如何创建一个可以根据输入参数任意多次拆分字符串的函数?

  10. 10

    如何将一个cshtml页面跳转到另一个cshtml?

  11. 11

    如何将一个模块的输出信号连接到另一模块的输入信号

  12. 12

    向量将最后一个内容旋转到开头

  13. 13

    如何将一个DataFlow任务的输出用作另一个DataFlow任务的输入?

  14. 14

    如何将一个sparql查询的输出作为输入传递给另一个sparql查询

  15. 15

    如何将一个回声的输出传递给另一个回声的输入?

  16. 16

    平滑旋转到一个角度

  17. 17

    平滑旋转到一个角度

  18. 18

    传递一个接受任意数量和类型参数的函数作为类模板参数

  19. 19

    如何将一个过程的输出作为参数传递给 tcl 中的另一个过程

  20. 20

    如何将一个函数作为参数传递给另一个函数

  21. 21

    R-如何将一个函数作为参数传递给另一个函数?

  22. 22

    如何将参数从一个函数发送到另一个函数

  23. 23

    如何将参数从一个函数传递到另一个函数

  24. 24

    如何将参数传递给作为另一个函数参数的函数

  25. 25

    ThreeJS:如何将一个对象的旋转克隆到另一个

  26. 26

    以任意数量的另一个函数作为参数的函数

  27. 27

    如何将一个命令的输出除以另一个命令的输出?

  28. 28

    从具有相同输入和输出数量的另一个函数中调用一个函数

  29. 29

    如何将函数输出传递给另一个函数

热门标签

归档