如何在C++中将前置函数参数设置为默认值?

3

如果这个基本问题已经被解答了,我很抱歉。如果我想让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;
}

1
重载 printer() 有什么问题吗? void printer(int b=0, int c=0) 并在函数内部声明 int a - user1905552
将以上评论作为答案添加。 - quamrana
6个回答

3
你不能这样做,这是不允许的。只有最右侧的参数可以省略。

2

第一个默认参数后的所有参数都是默认参数。在这种特殊情况下,您可以通过更改参数顺序来获得所需结果:

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


2

使用std::placeholders::N将参数委托给从std::bind返回的函数对象来指定。

int main()
{
   auto f = std::bind(printer, 0, std::placeholders::_1, std::placeholders::_2);

   f(4, 5);
}

现场演示


1
除非f将经常使用,否则这可能有点过度设计了! - Joseph Mansfield

2

默认参数列表是右关联的。因此不可能省略第一个参数列表。


0
你可以使用函数重载来实现你想要的效果:
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的调用都是模糊的,因为两个版本都匹配参数列表。 - Pete Becker
回答已更新,请查看。 - Alexander Shukaev

0

你不能完全这样做,但解决这个问题的一种方法是传递一个带有参数的结构体:

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 &params) {
  printer(params.a,params.b,params.c);
}


int main(){
  PrinterParams params;

  params.b = 1;
  params.c = 2;
  printer(params);

 return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接