怎样失掉函数的参数个数 c (怎样失掉函数的值)
本文目录导航:
c++ 怎样失掉函数的参数个数
应用c++新规范中的可变模板,可以用以下方法:
同名不同参:上手variadic template and fold expression
基本一切的编程言语都支持一个函数接受恣意个参数,比如Python的*args。
本文以C++为例,讨论同名不同参的函数成功。
遇到需求是一个函数要接受多个参数时,通常的做法是经常使用函数重载,即编写多个同名函数,区分接受不同个数的参数。
但是,这种方法存在多个疑问。
首先,代码重复度高,例如:func(para1), func(para1, para2), func(para1, para2, para3),这些函数无法相互调用,由于func1调用func3象征着须要给para2、para3赋值,这在语义上并不正当。
如此一来,函数之间代码高度相似,仅需微调参数数量,这种做法容易造成重复和不用要的人力消耗。
此外,重载函数往往只支持字符串类型参数,而实践上,如std::cout这样的函数支持多种类型,如int、char等。
经常使用者须要将这些类型转换为字符串,这参与了代码复杂性和用户累赘。
重载虽有其作用,但在通常中很容易被滥用。
重载通罕用于成功相反配置但接受不同参数的状况。
但是,当参与新参数后,配置虽基本坚持分歧,但实践成功却发生了变动。
此时,应该给予函数新的称号,如funcWithbalabal,以防止混杂。
因此,重载应仅用于成功相反目标但输入参数有所区别的场景。
若输入参数存在差异,即使配置有堆叠,也不应经常使用重载。
这防止了经常使用者须要深化函数外部才干了解配置差异,给代码的可读性和保养性带来困扰。
针对本文的需求,引入variadic template(C++ 11)可以处置上述疑问。
variadic template是一种参数可变的模板函数,准许函数接受恣意数量的参数。
经过这种方法,可以编写一份代码来处置不同的参数汇合。
成功同名不同参的处置打算,通常驳回递归、函数式编程或C++17的新个性fold expression。
本文以fold expression为例,由于它繁复且易于了解和成功。
fold expression准许在函数外部以一种紧凑且直观的模式处置恣意数量的参数。
详细成功时,只有将一切参数衔接并打印,例如,关于两个参数s1和s2,代码可以写作(std::cout << s1 << s2)。
关于三个参数s1、s2和s3,则可以写作(std::cout << s1 << s2 << s3)。
fold expression简化了这一环节,使得代码愈加繁复明了。
综上所述,经过经常使用variadic template和fold expression,咱们能够以更高效、更灵敏的模式成功同名不同参的函数需求,防止了代码重复和不用要的人力消耗,同时也优化了代码的可读性和保养性。
可变参数模板
在编程中,咱们经常须要编写模板以成功复用代码,而个别模板只能经常使用固定数量的参数。
可变参数模板则提供了接纳恣意数量参数的才干,极大地增强了代码的灵敏性。
定义一个可变参数类模板时,咱们可以在模板参数列表中引入一个模板参数包,准许该包接纳零个或多个参数。
这样,咱们就可以编写出能够处置恣意参数数量的函数或类。
实例化时,关于类模板,可变模板参数包必定是最后一个参数。
而在函数模板中,这种限度不复存在。
应用递归技巧,咱们能成功处置恣意数量参数的函数。
经常使用可变参数模板,咱们可以创立一个安保地处置不同数量参数的函数,如processValues()。
这个函数能遍历传入的可变参数列表,并对每个参数调用相应的handleValue()函数。
经过...运算符,咱们能实如今调用时将参数包倒退为单个参数。
在处置参数时,须要留意...运算符的双重含意:在参数模板列表中,它示意可变参数包;而在函数调用中,它示意参数包倒退。
确保模板中至少有一个参数,经过...倒退参数,函数能够递归地调用自身,直至参数数量降至一个。
在成功中,咱们或许面临复制传值的开支疑问,尤其是关于大型数据结构。
为处置此疑问,可以思考经常使用援用传值,或许驳回右值援用与std::forward函数,以优化性能。
最后,咱们可以应用可变参数模板成功简化版的printf函数,例如tprintf。
其上班原理与processValues()相似,但首参数固定为const char*。
经过可变参数模板,咱们不只增强了代码的灵敏性,还提高了复用性与效率,是现代编程中无法或缺的技术。