函数调用作为默认参数 - 可以在封装中使用其他参数吗?

时间:2012-01-04 19:35:35

标签: c++ function-parameter default-parameters

假设我有以下函数,代码中的许多其他函数需要它产生的值:

float mean(foo param1, bar param2);

我的其他功能如下:

float foobar(foo param1, bar param2, float meanValue);

我想做的是以下内容:

float foobar(foo param1, bar param2, float meanValue = mean(param1, param2));

虽然传入函数作为默认参数是合法的,但编译器(VS2008)抱怨 param1 param2 未被声明 - 因为参数被推送到从右到左堆叠,从 meanValue 开始。当然,我无法反转参数的顺序,因为在这种情况下,我无法为第一个参数指定默认值。

我可以传递一些像-10000这样的值来告诉自己调用mean()函数;或者我可以重载每个函数(并且有10+超载),但这不是很整洁。我认为将一个函数作为默认参数调用真的很酷,我想知道是否有一种巧妙的方法可以完成我想要做的事情。

1 个答案:

答案 0 :(得分:3)

C ++标准没有指定参数被推送到堆栈的顺序,或者它们是否被推送,或者架构上是否有堆栈。

你没有提供很多关于为什么你有这么多这样的函数以及它们如何不同的信息,但是以下内容可能有助于减少重载次数:

template< typename T1, typename T2 >
float foobar(T1 param1, T2 param2)
{
    return foobar(param1, param2, mean(param1, param2));
}

请注意,如果需要,您可以创建结果类型和调用的函数,以及mean()函数,所有模板参数。