是否有一个很好的方法来编写带有函数调用的默认参数的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是属于未在头文件中实例化的对象的函数。
答案 0 :(得分:7)
去图吧!它确实有效。 Default arguments in C++ functions
答案 1 :(得分:7)
我会使用两个重载函数:
int foo(int x, int y);
int foo(int x){return foo(x,bar);}
如果允许内联转发功能,则性能损失可能会小到零。如果你将它的主体保留在非头文件中,那么可能会有性能成本(可能很小),但实现的灵活性要大得多,并且耦合会减少。
答案 2 :(得分:6)
是。你写的是什么。
答案 3 :(得分: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
}
我认为这比尝试使用某些动态默认值更清晰,更灵活。
答案 4 :(得分:4)
在标准的8.3.6节(默认参数)第5段中,他们仅使用这种方法给出了一个例子。具体来说,它调用默认参数是表达式,因此应用函数调用,尽管有名称查找和类型兼容性等限制。
在我的工作场所,我们使用了这样的签名:
void An_object::An_object(
const Foo &a,
const Bar &b,
const Strategem &s = Default_strategem()
);
允许客户端覆盖类构造函数中的行为。它对于影响译者表现的条件行为派上用场了......
答案 5 :(得分:2)
切向,但在我看来,它会引入依赖性问题。我会选择stbuton.myopenid.com的方法。
答案 6 :(得分:1)
只要函数/对象的声明在范围内,在此上下文中调用全局函数或引用全局对象应该是完全有效的。它可能是也可能不是(在良好的设计方面),但它应该有效。
答案 7 :(得分:0)
尝试使bar()成为静态成员函数。这将允许具有此类静态类的程序的任何部分访问它。例如:
类Foo { 公共:
static int bar(); };
然后你会声明:
int foo(int x,int y = Foo :: bar());
如果您需要不同的对象,则改为传入对象的实例。