1

我有一个广泛使用的 c++ 库,其中包含以下方法:

foo();

我想重载此函数以具有默认参数,例如:

foo(bool verbose=false);

此更改是否会迫使我重新编译使用此函数的每个代码?foo()由于 no-args-signature 没有改变,没有参数的调用不能继续工作吗?

顺便说一句 - 我正在使用 gcc

谢谢

4

2 回答 2

3

此更改是否会迫使我重新编译使用此函数的每个代码?

是的,编译会失败,因为会有歧义。

你可以做的是像这样重载函数:

foo(bool verbose);

并将这种情况foo()视为参数为假。

这不需要重新编译。你只有两个功能:

foo() { foo(false); } //possibly
foo(bool verbose);

而不是一个带有默认参数的。

于 2012-08-28T14:03:24.813 回答
1

如果你的意思是你想要两者都有,那么你不能,因为没有办法知道你的意思。

如果您的意思是要替换foo()为,foo(bool verbose=false)那么它将是重新编译,因为调用代码并不是真正foo()的调用,而是foo(false)使用隐藏它的语法糖进行调用。

你可以有:

someType foo(bool verbose)
{
  //real work here.
}
someType foo()
{
  return foo(false);
}

或者如果无效:

void foo(bool verbose)
{
  //real work here.
}
void foo()
{
  foo(false);
}

虽然如果你的前任foo()完全在一个标题中并且可以内联,那是另一回事。

于 2012-08-28T14:14:29.047 回答