如何在c ++中将前面的函数参数设置为其默认值?
Posted
技术标签:
【中文标题】如何在c ++中将前面的函数参数设置为其默认值?【英文标题】:How to set a preceding function parameter to its default in c++? 【发布时间】:2013-04-14 15:01:53 【问题描述】:如果这个基本问题已经得到解答,我们深表歉意。我会在print()
的括号内放什么,以便将第一个参数保留为默认值,但为以下参数赋予新值 1 和 2?我知道我可以从字面上把 0 放在那里,但有没有办法让它默认?
#include<iostream>
using namespace std;
void printer(int a=0, int b=0, int c=0)
cout << a << endl;
cout << b << endl;
cout << c << endl;
int main()
//leave a=0 and replace both b and c
printer(/*?*/,1,2);
return 0;
【问题讨论】:
重载printer()
有什么问题吗? void printer(int b=0, int c=0)
并在函数内部声明int a
?
添加以上评论作为答案。
【参考方案1】:
你不能这样做,这是不允许的。只有最右边的参数可以省略。
【讨论】:
【参考方案2】:默认参数列表是右关联的。所以不可能省略第一个参数列表。
【讨论】:
【参考方案3】:第一个默认值之后的所有参数都是默认值。在这种特殊情况下,您可以通过更改顺序获得所需的内容:
void printer(int b=0, int c=0,int a=0)
cout << a << endl;
cout << b << endl;
cout << c << endl;
//leave a=0 and replace both b and c
printer(1,2);
输出:
0
1
2
【讨论】:
【参考方案4】:使用std::placeholders::N
将要指定的参数委托给从std::bind
返回的函数对象。
int main()
auto f = std::bind(printer, 0, std::placeholders::_1, std::placeholders::_2);
f(4, 5);
Live Demo
【讨论】:
除非经常使用f
,否则这可能有点矫枉过正!【参考方案5】:
您不能完全做到这一点,但解决此问题的一种方法是使用您的参数传递一个结构:
struct PrinterParams
int a,b,c;
PrinterParams() : a(0), b(0), c(0)
;
void printer(int a, int b, int c)
cout << a << endl;
cout << b << endl;
cout << c << endl;
void printer(const PrinterParams ¶ms)
printer(params.a,params.b,params.c);
int main()
PrinterParams params;
params.b = 1;
params.c = 2;
printer(params);
return 0;
【讨论】:
【参考方案6】:你可以利用函数重载来实现你想要的:
void printer(int a, int b, int c)
cout << a << endl;
cout << b << endl;
cout << c << endl;
void printer()
printer(0, 0, 0);
void printer(int b = 0, int c = 0)
printer(0, b, c);
int main()
// leave a = 0 and replace both b and c
printer(1, 2);
return 0;
【讨论】:
这不起作用。任何对printer
的参数少于三个的调用都是模棱两可的,因为两个版本都与参数列表匹配。
更新了答案,请看。以上是关于如何在c ++中将前面的函数参数设置为其默认值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 phpmyadmin 中将“关系显示列”设置为默认值