在C ++中使用非默认参数之间的默认参数创建函数

时间:2013-03-06 10:34:26

标签: c++

我的雇主公司有一个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调用提供了类似实现的编译错误。

我希望我能够清楚地理解这个问题。

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

谢谢。

5 个答案:

答案 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

有一个提升库

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