首页 > 其他分享 >形参包及展开

形参包及展开

时间:2024-06-09 22:46:19浏览次数:14  
标签:... 递归 形参 包及 max 形参包 reduce 展开

最近在写IOU的时候想模仿上交的写法用形参包写一个可以接受不限参数的max或者min,但是真写起来坑太多了

形参包是c++11引入的语法,当使用形参包作为函数的形参时,可以传入不限个数以及类型的(0-....)参数。实质上形参包展开后就是使用逗号隔开的多个形参。

template <class T, class... Tp>
T reduce_max(T firstarg, Tp... args)
{
        return max(firstarg, reduce_max(args...));
}

这里的参数class ...Tp就是一个模板形参包类型的声明格式。注意当形参包作为参数时只能写在最后一个位置上。
作为类型时使用Tp... 参数名作为形参包类型的声明。
对应有几个操作。

template<class ...Tp>
size_t get_len(Tp ... args)
{
	cout << sizeof...(Tp) << endl;
	cout << sizeof...(args) << endl;
}

使用sizeof...运算符返回形参包的一些性质,前者返回类型个数,后者返回参数个数

形参包展开是指将打包的形参包展开为 int a, int c, int b, float d的形式,即展开为用逗号隔开的形参的形式

以上面的函数的为例,当传入

reduce_max(1,5,3,6,7)

时,其递归过程如下,我们不妨用中括号扩出形参包内的参数(不符合语法)

reduce(1, [5,3,6,7])
reduce(5,[3,6,7])
reduce(3,[6,7])
reduce(6,[7])
reduce(7,?) --5
reduce(?, ?)
.....

显然在最后一次递归时传入一个长度为0的形参包,这是没有意义的,而且如果不给出递归出口会导致无限递归。

解决的一种方法是再给出一个仅接受一个参数的重载

template <class T>
T reduce_max(T firstarg)
{
        return firstarg;
}

这样当递归到第五步时会调用这个重载,从而终止递归。
亦或这像这样写(从上交那里学来的)

template <class T, class... Tp>
T reduce_max(T firstarg, Tp... args)
{
    if constexpr (sizeof...(args) <= 0)
        return firstarg;
    else
        return max(firstarg, reduce_max(args...));
}

使用constexpr让if后的表达式在编译期确定范围,从而为其创造静态的递归出口。
如果不加constexpr的话连编译期都过不了

标签:...,递归,形参,包及,max,形参包,reduce,展开
From: https://www.cnblogs.com/CrescentWind/p/18240158

相关文章

  • 偶函数在零点的泰勒展开式相关知识点
     步骤1:理解偶函数的定义偶函数是指满足f(x)=f(−x)f(x)=f(-x)f(x)=f(−x)的函数。这意味着偶函数关于yyy轴对称。步骤2:理解泰勒展开泰勒展开是一种将函数表示为无穷级数的方法,它在函数在某一点的所有导数都存在的情况下非常有效。对于函数f(x)f(x)f(x)在零点......
  • 利用幂级数展开式求不定式极限
    将不定式极限中的函数进行幂级数展开,再进行计算,必要时可进行等价无穷小量替换.例1  因为,所以   例2 因为,所以   ......
  • 使用jQuery实现鼠标移入展开导航的二级菜单栏
    1、首先写出html结构(举个例子)<divclass="nav"><ul><li><ahref="#">全国导航</a><ulclass="nav_meun"><li><ahref=&qu......
  • LLM 扩展开发工具
    参考知乎:  大模型Agent智能体25款产品、商业案例随笔记(一) 、 基于大模型的AI搜索15款产品随笔记(二)LLM扩展开发工具:1、开源且无需编码(No-Code)的LLM应用构建工具: https://flowiseai.com/ ,将永远免费供商业和个人使用。   代码库: https://github.com/FlowiseAI......
  • python 函数 形参前带*或者两个星** 收集元组或者字典,实参前带星*或者两个星** 解开序
    函数的形参前面带一个星*,代表着不定长参数,实际上是收集了不定长的实参,作为一个元组。形参前面带两个星**,代表可以接收不定长参数,并且调用该函数时实参要指定参数名,实际上是收集了一个不定键个数的字典。实参前带一个星*,表示解开当前的序列,再做为参数传递。实参前带两个星**,表示......
  • win11右键子菜单展开增加延时
    展开注册表HKEY_CURRENT_USER\ControlPanel\Desktop在右侧窗格中,查找名为MenuShowDelay的字符串值。如果没有此项,可以右键单击空白处,选择新建>字符串值,然后将其命名为MenuShowDelay。双击MenuShowDelay项,修改其值数据。默认值是400(单位是毫秒)。你可以将其改为更高的......
  • ABPVNext问题集锦-SwaggerUI的配置问题,配置Schema自动展开
    一,ABP框架中,运行的SwaggerUI中,默认情况下,不管Post还是Get等请求接口的Schema默认情况是折叠的,前端接入接口时需要一个个手动点开,如果参数过多比如100个参数 要点100次,使用不是太方便,或那种又有查询、又有新增,并且json里面各种套,对象里面有数组,数组里面套数据,  这种参数就很多了......
  • Java 形参 实参 参数传递
    Java形参实参在Java中,形参和实参是两个重要的概念,它们分别指形式参数和实际参数。形参:形式参数是在方法定义时用于接收调用该方法时传递的参数。它只在方法内部有效,方法结束后就消失了。实参:实际参数是在调用方法时传递给方法的参数,它可以是常量、变量、表达式、或者方法的......
  • 在 JavaScript 中递归展开数组
    对嵌套数组使用递归:递归是处理嵌套数组的干净而有效的方法。它允许您处理任意深度的数组。使用该Array.isArray方法检查数组:这有助于确保代码适用于不同的数据类型并且更加健壮。 潜在性能问题:对大型数组要小心:处理非常深或很大的数组时,递归函数可能会导致堆栈溢出错误。在这......
  • openGauss ODBC包及依赖的库和头文件
    ODBC包及依赖的库和头文件Linux下的ODBC包从发布包中获取,包名为openGauss-x.x.x-ODBC.tar.gz。Linux环境下,开发应用程序要用到unixODBC提供的头文件(sql.h、sqlext.h等)和库libodbc.so。这些头文件和库可从unixODBC-2.3.0的安装包中获得。详情查看:https://opengauss.org详情查看......