如何使用 C++ 中的给定伪代码创建一个递归的可变参数函数?

道尔顿

我正在尝试创建一个适用于以下示例的递归可变参数模板函数。该示例没有任何实用性,仅用于帮助更好地理解我的要求。所以,基本上我有一个函数,它接受无限数量的相同类型的参数,它递归地调用除最后一个参数之外的所有参数。然后,一旦它最终达到两个参数,下一个函数就作为函数的终止。我知道答案并非微不足道,而且我很难弄清楚该怎么做。任何帮助或指导将不胜感激!谢谢。

template <typename... Ts>
void test(int& a, int& b, Ts&... ts){
    test(a, b, ... ); //all but the last parameter

    //last parameter argument is processed here

}

void test(int& a, int& b){
    //end of recursion
}

int main(int argc, char** argv){

    int a = 3;
    int b = 5;
    int c = 6;
    int d = 4;

    test(a, b, c, d);

    return 0;
}
如果

我们可以在元组中转发参数并减少索引:

#include <cstddef>
#include <tuple>
#include <utility>

template <std::size_t I, typename Tuple>
void test_helper(Tuple&& tuple)
{
    if constexpr (I != 0) {
        test_helper<I - 1>(std::forward<Tuple>(tuple));
    }

    // for example
    process(std::get<I>(std::forward<Tuple>(tuple)));
}

template <typename... Args>
void test(Args&&... args)
{
    test_helper<sizeof...(Args) - 1>(std::forward_as_tuple(std::forward<Args>(args)...));
}

例子:

#include <cstddef>
#include <iostream>
#include <tuple>
#include <utility>

template <typename T>
void process(const T& arg)
{
    std::cout << arg << '\n';
}

template <std::size_t I, typename Tuple>
void test_helper(Tuple&& tuple)
{
    process(std::get<I>(std::forward<Tuple>(tuple)));

    if constexpr (I != 0) {
        test_helper<I - 1>(std::forward<Tuple>(tuple));
    }
}

template <typename... Args>
void test(Args&&... args)
{
    test_helper<sizeof...(Args) - 1>(std::forward_as_tuple(std::forward<Args>(args)...));
}

int main()
{
    test(1, '2', "3", 4.0);
}

现场演示


现在,更喜欢从左到右处理参数,这要简单得多:

template <typename... Args>
void test(Args&&... args)
{
    ((void)process(std::forward<Args>(args)), ...);
}

使用P1858 通用包声明和使用从右到左的处理会变得更容易,遗憾的是尚未采用:

template <typename... Args>
void test(Args&&... args)
{
    test(std::forward<Args>(args)...[:-1]...);

    if constexpr (sizeof...(Args) != 0) {
        process(std::forward<Args>(args)...[-1]);
    }
}

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何创建一个返回另一个函数的函数,在C中隐式包含给定参数?

如何在C ++中将可变参数函数与另一个函数消除歧义

我正在尝试创建一个使用C ++中的参数包构造函数的异常类

如何使用C#中的visible属性创建一个函数来更改任何给定对象的可见性?

我如何创建一个接受可变数量的int的C ++构造函数

什么是可变类。我们如何在C#中创建一个可变且不可变的类

如何在c ++中创建一个函数,该函数具有由参数确定的矩阵大小?

如何在 C 中编写一个可变参数函数,该函数接受整数并在动态字符串中将它们全部返回?

如何在 C++ 中创建一个具有多个参数但只需要一个参数的函数?

如何在 C++ 中创建一个接受大括号中的参数的类构造函数?

如何创建一个C ++宏来定义使用调用另一个函数的参数列表的函数?

在C ++ 11中使用模板参数的递归可变参数void函数

如何在一个类中创建一个模板函数?(C ++)

如何使用 C 中的 UNIX 信号将给定的字符串给定的参数发送到另一个程序?

如何在C ++中创建一个函数原型,该函数原型接受两个整数作为参数并返回它们的差值?

如何在Swift中创建一个通用函数,除非它是可选参数,否则它将拒绝给定参数?

如何将函数的结果用作C中另一个函数的参数?

如何使用命令行参数的子集调用另一个 C 文件中的函数?

C ++线程:如何使用lambda函数将主线程中的参数传递给另一个线程

另一个使用引用和参数的函数中的C ++调用函数

C#如何在一个函数中创建类的实例,然后在另一个函数中使用相同的实例

如何声明函数一次传递一个参数argv [i]?在C中

如何使用可调用的伪类型将函数用作php中另一个函数的参数?

如何在 C# 中创建一个填充两个 DataGridView 的函数

如何使用SWIG使用可变参数包装C函数

如何检索C99可变参数宏的最后一个参数?

如何在c中另一个函数之前和之后执行通用代码?

如何创建一个函数可以使用自定义的可比 C++?

如何在 C++ 中声明一个通过引用将数组作为参数的函数?