如果我有以下功能定义。在调用时,我希望只为 a 和 c 传递值,并为 b 使用默认值 我将如何调用此函数
void func(int a=5,int b=2, int c=3)
{
..........
.........
}
如果我有以下功能定义。在调用时,我希望只为 a 和 c 传递值,并为 b 使用默认值 我将如何调用此函数
void func(int a=5,int b=2, int c=3)
{
..........
.........
}
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
根据 C++ 11 标准 (N3485):8.3.6 [dcl.fct.default]
对于非模板函数,可以在相同范围内的函数声明中添加默认参数。标准示例:
无效 f(int, int)
无效 f(int, int = 7); //好的
所以规则是你必须从参数列表的右边到左边指定默认参数。您不能只指定默认值a
而不指定b
andc
之前:
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
因此,您可以根据需要同时使用b
and的默认值c
,或者只使用c
,但不能使用 onlyfunc
的默认值调用,b
因为它位于参数列表的中间,同样,您不能使用onlyfunc
的默认值调用a
. 这样,您只需添加声明而没有多余的代码。但是,您不能真正调用它们,以便它们可以以任意方式使用默认值。
您可以在此处找到一个实时示例默认参数示例
作为建议:提升参数
#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);
}
有几个选项供您选择。
选项 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:调整您的函数,使参数的顺序更符合逻辑。
你可以简单地做这样的事情
#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);