3

如果我有以下功能定义。在调用时,我希望只为 a 和 c 传递值,并为 b 使用默认值 我将如何调用此函数

void func(int a=5,int b=2, int c=3)
{
..........
.........
}
4

5 回答 5

2

C++ 不支持以下类型的语法:

func(1, , 2);

这意味着只有您省略的最右边的参数才能采用默认值。

如果您希望能够以任意组合使用默认参数,您可以考虑使用boost::optional

#include <boost/optional.hpp>
#include <iostream>

typedef boost::optional<int> OptionalInt;
typedef boost::optional<int> Default;

void func(OptionalInt a, OptionalInt b, OptionalInt c)
{
   if (!a) a = 5;
   if (!b) b = 2;
   if (!c) c = 3;
   std::cout << *a << std::endl;
   std::cout << *b << std::endl;
   std::cout << *c << std::endl;
}

int main()
{
   func(1, Default(), 1);
}

输出:

1
2
1
于 2013-04-27T21:23:28.790 回答
1

根据 C++ 11 标准 (N3485):8.3.6 [dcl.fct.default]

对于非模板函数,可以在相同范围内的函数声明中添加默认参数。标准示例:

无效 f(int, int)

无效 f(int, int = 7); //好的

所以规则是你必须从参数列表的右边到左边指定默认参数。您不能只指定默认值a而不指定bandc之前:

void func(int a = 10, int b, int c); //ERROR

但是,您可以尝试以下方法:

void func(int a,int b, int c=3); //set default for c at first
void func(int a,int b = 5, int c);  //at later declarations, set for b
void func(int a =10, int b, int c);//at even later declarations, set for a

有了上面的,你可以调用函数如下:

func(20); //call use default value of b and c
func(15,20); //call use default value of c
func(10,20,30); //do not use default value
func(); // use default values for a, b and c

因此,您可以根据需要同时使用band的默认值c,或者只使用c,但不能使用 onlyfunc的默认值调用,b因为它位于参数列表的中间,同样,您不能使用onlyfunc的默认值调用a. 这样,您只需添加声明而没有多余的代码。但是,您不能真正调用它们,以便它们可以以任意方式使用默认值。

您可以在此处找到一个实时示例默认参数示例

于 2013-04-27T21:13:24.157 回答
0

作为建议:提升参数

#include <boost/parameter/name.hpp>
#include <boost/parameter/preprocessor.hpp>

BOOST_PARAMETER_NAME(a)    
BOOST_PARAMETER_NAME(b)
BOOST_PARAMETER_NAME(c)

BOOST_PARAMETER_FUNCTION((void),
                         func,
                         tag,
                         (optional            
                          (a, *, 5)
                          (b, *, 2)
                          (c, *, 3)))
{
}
int main()
{
    func(_a = 5, _c = 3);
}
于 2013-04-27T21:31:40.583 回答
0

有几个选项供您选择。

选项 1:传递一个类似字典的对象:

struct myParameters {
    int a,b,c;
    myParameters( ) : a(3), b(4), c(5) {}
}
void myFunction( const myParameters &p ) {
    int a = p.a;
    int b = p.b;
    int c = p.c;
    // stuff
}

myParameters t;
t.a = 3;
t.c = 7;
myFunction( myParameters );

选项 2:使用其他无意义的值来表示默认值:

#define DEFAULT -1;
void myFunction( int a = DEFAULT, int b = DEFAULT, int c = DEFAULT ) {
    if( a == DEFAULT ) { a = 3; }
    if( b == DEFAULT ) { b = 4; }
    if( c == DEFAULT ) { c = 5; }
    // stuff
}

(但当然你不能-1作为实际值传递;你也可以使用INT_MAX或其他东西)

选项 3:使用重载和枚举(可能会变得混乱):

enum NoVal {
DEFAULT
};
void myFunction( int a = 3, int b = 4, int c = 5 ) {
    // stuff
}
void myFunction( int a = 3, NoVal, int c = 5 ) {
    return myFunction( a, 4, c );
}
void myFunction( NoVal, int b = 4, int c = 5 ) {
    return myFunction( 3, b, c );
}
void myFunction( NoVal, NoVal, int c = 5 ) {
    return myFunction( 3, 4, c );
}

myFunction( 10, DEFAULT, 2 );

选项 4:调整您的函数,使参数的顺序更符合逻辑。

于 2013-04-27T21:31:52.020 回答
0

你可以简单地做这样的事情

#define DEF 0
void func(int *a, int *b, int *c) {
  if (a) *a = 5;
  if (b) *b = 2;
  if (c) *c = 3;
}

并这样称呼它:

int x = 9;
int y = 10;
func(&x, DEF, &y);
于 2013-04-27T21:32:51.057 回答