6

有没有一种很好的方法来编写带有函数调用的默认参数的 C/C++ 函数头?

我有一些带有该功能的标题:

int foo(int x, int y = 0);

我在一个大型代码库中工作,其中许多函数调用此函数并依赖于此默认值。这个默认值现在需要更改为动态的,我正在寻找一种方法:

int foo(int x, int y = bar());

其中 bar() 是一些基于某些系统参数生成默认值的函数。或者,这个函数原型看起来像:

int foo(int x, int y = baz.bar());

其中 baz 是属于尚未在头文件中实例化的对象的函数。

4

8 回答 8

7

去搞清楚!它确实有效。C++ 函数中的默认参数

于 2008-10-14T20:48:11.707 回答
7

我会使用两个重载函数:

int foo(int x, int y);

int foo(int x){return foo(x,bar);}

如果您允许内联转发函数,那么性能损失可能会小到零。如果你在非头文件中保持它的主体不符合要求,可能会产生性能成本(可能很小),但在实现方面会有更大的灵活性并减少耦合。

于 2008-10-14T20:52:38.327 回答
6

是的。你所写的作品。

于 2008-10-14T20:47:20.180 回答
6

简单地删除第一个声明中的可选参数并提供单个参数重载有什么问题?

int foo(int x)
{
    Bar bar = //whatever initialization
    return foo(x,bar.baz());
}

int foo(int x,int y)
{
  //whatever the implementation is right now
}

我认为这往往比尝试使用一些动态默认值更干净、更灵活。

于 2008-10-14T20:52:44.833 回答
4

在标准的第 8.3.6 节(默认参数)第 5 段中,他们给出了一个仅使用这种方法的示例。具体来说,它指出默认参数是表达式,因此可以应用函数调用,尽管有名称查找和类型兼容性等限制。

在我的工作场所,我们使用过这样的签名:

void An_object::An_object(
  const Foo &a,
  const Bar &b,
  const Strategem &s = Default_strategem()
);

允许客户端覆盖类构造函数中的行为。它对于影响翻译性能的条件行为非常有用......

于 2008-10-14T23:48:57.893 回答
2

切线,但在我看来,它会在未来引入依赖问题。我会采用 stbuton.myopenid.com 的方法。

于 2008-10-14T21:32:07.280 回答
1

只要函数/对象的声明在范围内,在此上下文中调用全局函数或引用全局对象应该是完全有效的。它可能是可取的,也可能不是可取的(就良好的设计而言),但它应该有效。

于 2008-10-14T20:48:50.910 回答
0

尝试使 bar() 成为静态成员函数。这将允许程序的任何部分在范围内具有这样的静态类来访问它。例如:

类Foo {公共:

静态 int bar(); };

然后你会声明:

int foo(int x, int y = Foo::bar());

如果您需要不同的对象,则改为传入对象的实例。

于 2008-10-14T20:53:46.000 回答