1

我的雇主公司有一个 API 包,我被要求使用某个类的某个功能为 QA 创建一个测试。函数是这样的:

void func(int a, int b, int c, int d, int e);

其中b&d是默认参数。这些类型显然不是int,我在这里创建它们是为了理解目的。NULL目前我可以通过传递默认参数来使用该函数。但我在想,在上述函数的情况下,如果&func的默认值是非零的,说& 用户不知道这个 & 如果他使用了(即 = 0),那么会得到不同的结果。bd1NULL

所以我想知道我应该如何创建在非默认参数之间具有默认参数的函数,并且我不需要为该参数传递任何东西,即

func(23, , 34, , 45);

目前 VS2010 为我们公司的 API 调用提供了类似实现的编译错误。

我希望我把这个问题说得很清楚以便理解。

我也尝试在其他地方搜索类似的问题,但找不到我的查询的解决方案。

谢谢你。

4

5 回答 5

5

你不能这样做,你必须把所有非可选参数放在第一位,然后是可选参数。

您可以在此处阅读有关可选参数的更多信息。微软说:

默认参数仅在省略尾随参数的函数调用中使用——它们必须是最后一个参数。因此,以下代码是非法的:

int print( double dvalue = 0.0, int prec );
于 2013-03-06T10:36:13.783 回答
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);
于 2013-03-06T10:40:00.017 回答
2

您如何期望编译器知道您的意思是传递 a、c 和 e 而不是其他三元组?在函数声明中,具有默认值的参数之后的所有参数都应具有默认值。所以你永远不能有默认的 b 和 d - 每当你只向这个函数传递三个参数时,这意味着你想为最后两个参数使用默认值,它们是 d 和 e。将您的可选参数作为函数中的最后一个移动。

于 2013-03-06T10:37:05.167 回答
0

没有直接的方法可以实现您正在寻找的东西。

第一种选择是使用boost::optional<T>for 参数。

另一种选择可能是named parametersBoost 参数库中实现。

如果您认为这可能适合您,并且您想进一步详细说明如何将这些用于您的用例,请告诉我,我将编辑此答案。

于 2013-03-06T10:45:33.453 回答
0

这个boost::parameter http://www.boost.org/doc/libs/1_53_0/libs/parameter/doc/html/index.html有一个 boost 库

它支持任意顺序的命名参数,未使用参数的默认值。

于 2013-03-06T12:13:28.467 回答