我的雇主公司有一个API包&我被要求使用类的某个函数为QA创建测试。功能是这样的:
void func(int a, int b, int c, int d, int e);
b
& d
是默认参数。这些类型显然不是int
,我在这里创建它们是为了理解目的。目前,我可以通过传递NULL
作为默认args来使用该功能。但我正在思考上述函数func
的情况,如果是b
&的默认值。 d
非{0}代表1
&用户不知道这个&如果他使用NULL
(= 0),则会得到不同的结果。
所以我想知道如何创建这样的函数,这些函数在非默认值和&之间具有默认args;我不需要为那个arg传递任何东西,例如。
func(23, , 34, , 45);
目前VS2010为我公司的API调用提供了类似实现的编译错误。
我希望我能够清楚地理解这个问题。
我也尝试在其他地方搜索类似的问题,但找不到我的查询解决方案。
谢谢。
答案 0 :(得分:5)
你不能这样做,你必须先把所有非可选参数,然后是可选参数。
您可以阅读有关可选参数here的更多信息。微软说:
默认参数仅在省略尾随参数的函数调用中使用 - 它们必须是最后一个参数。因此,以下代码是非法的:
int print( double dvalue = 0.0, int prec );
答案 1 :(得分:4)
void func(int a, int c, int e)
{
int default_b = 1;
int default_d = 1;
func(a, default_b, c, default_d, e);
}
否则你根本就不能,因为C ++中没有命名参数。
(虽然另一种解决方案是使用boost :: bind或类似的函子)。
如果你可以修改原始功能,你可以在默认参数结束时使用默认值:
void func(int a, int c, int e, int b = 1, int d = 1);
答案 2 :(得分:2)
您如何期望编译器知道您的意思是传递a,c和e而不是其他一些三元组?在函数声明中,具有默认值的参数之后的所有参数都应具有默认值。所以你永远不会有默认的b和d - 只要你只将三个参数传递给这个函数,就意味着你想要使用最后两个参数的默认值,这些是d和e。将可选参数作为函数中的最后一个移动。
答案 3 :(得分:0)
没有直接的方法来实现您的目标。
第一种选择是使用boost::optional<T>
作为参数。
另一个替代方案可能是named parameters
,正如Boost Parameter Library中所实现的那样。
如果您认为这可能适合您,并且您希望进一步详细说明如何将这些用于您的用例,请告诉我,我将编辑此答案。
答案 4 :(得分:0)
此boost::parameter
http://www.boost.org/doc/libs/1_53_0/libs/parameter/doc/html/index.html
它支持任意顺序的命名参数,默认值为未使用的参数。