2011-11-18 118 views
0

我是新的c + +我有一个关于默认参数的问题。 如果有以下原型C++中的默认参数

void f(int=10,int=20,int=30,int=40) 

如果funcion是通过传递2个参数来叫,我们如何确保这些argumnts被视为第一和第三,而中,第二和第四采取的函数作为默认值。

+0

阅读MSDN文章 - http://msdn.microsoft.com/en-us/library/91563f79(v=VS.100).aspx – adatapost

回答

6

你不能。函数的参数按顺序与参数匹配。您可以使用,而不是重载的默认参数是这样的:

void myFunc(int a,int b,int c,int d); 
void myFunc(int a,int c) { 
    myFunc(a,20,c,40); 
} 
+1

你将如何确保'myFunc(1,2)'调用第二个函数,而不是第一个函数?另外,如果你想调用第一个函数,传递前两个参数呢? – Nawaz

+0

如果你没有在'void myFunc(int a,int b,int c,int d)的原型中定义默认值''编译器会选择正确的函数。否则,它会给你编译器错误。 – expert

+2

@Nawaz我没有把任何参数的默认参数。如果你想要第一个,为第二个提供四个参数或两个参数。 – IronMensan

3

应该是不可能的。他们会被视为前两名。

您可以使用不同的名称创建一个函数,带两个参数并调用f

另外,如果你想模拟命名参数,你可以使用类似于fluent interfaces的东西。例如:

#include <iostream> 
using namespace std; 

int f_impl(int a,int b, int c, int d){ 
    cout << a << " " << b << " " << c << " " << d << endl; 
    return 42; 
} 

struct f{ 
    int _a, _b, _c, _d; 
    f() : _a(10), _b(20), _c(30), _d(40){} 
    f& a(int a){ _a = a; return *this;} 
    f& b(int b){ _b = b; return *this;} 
    f& c(int c){ _c = c; return *this;} 
    f& d(int d){ _d = d; return *this;} 
    int operator()(){ return f_impl(_a, _b, _c, _d); } 
}; 

#define F(x) (f()x()) 

int main(){ 

    f().a(100).c(300)(); 

    cout << F(.b(1000).d(4000)) << endl; 

    return 0; 
} 

输出:

100 20 300 40 
10 1000 30 4000 
42 
3

这不是如何C++工作的默认参数。如果您将两个参数传递给函数f,它们将始终代表前两个参数,而后两个参数将为3040

换句话说,C++函数仅支持位置参数。

+3

...或者你可以请求标准委员会添加关键字参数。 :) –

1

正如其他人说你不能这样做,在C++。

但是,您可以使用四个整数成员创建结构/类,这些整数成员已初始化为您定义的值。你会将它作为参数传递给函数。

struct Param 
{ 
    int a; 
    int b; 
    int c; 
    int d; 

    Param() : a(10), b(20), c(30), d(40) {} 
    void setA(int value) { a = value; } 
    void setB(int value) { a = value; } 
    void setC(int value) { a = value; } 
    void setD(int value) { a = value; } 
} 

void f(Param& param) {} 

Param param; 
param.setA(67); 
param.setC(9); 
f(param); 
1

你问的是所谓'Named Parameters'的功能。

默认参数和命名参数的组合为您提供了更多选项来完成像您所建议的操作,但不幸的是,C++没有命名参数。但是,一些其他语言,如C#和VB以及可能是Python命名参数

0

实际上,您可以在C++中使用boost::parameter(在wiki文章中提到的命名参数中提供了一些帮助)命名参数。