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;
}
4

6 回答 6

3

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

于 2013-04-14T15:02:57.873 回答
2

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

于 2013-04-14T15:05:18.823 回答
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

于 2013-04-14T15:06:11.567 回答
2

用于std::placeholders::N将要指定的参数委托给从std::bind.

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

   f(4, 5);
}

现场演示

于 2013-04-14T15:06:31.800 回答
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;
}
于 2013-04-14T15:05:53.540 回答
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;
}
于 2013-04-14T15:15:27.080 回答