函数调用的结果可以用作默认参数值吗?
Posted
技术标签:
【中文标题】函数调用的结果可以用作默认参数值吗?【英文标题】:Can the result of a function call be used as a default parameter value? 【发布时间】:2010-09-17 04:37:50 【问题描述】:有没有一种很好的方法来编写带有默认参数的 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 是属于尚未在头文件中实例化的对象的函数。
【问题讨论】:
AFAIK 这与 C++ 而不是 C 相关(C 不支持默认值)。 【参考方案1】:是的。你所写的作品。
【讨论】:
真的吗?我从来没有想过。 大声笑。在自己尝试之前,我认为这显然是错误的。 从事 C++ 编程 8 年,不知道这个! 我一直在发现关于 C++ 的新事物 :-)【参考方案2】:去图吧!它确实有效。 Default arguments in C++ functions
【讨论】:
【参考方案3】:在此上下文中调用全局函数或引用全局对象应该是完全有效的,只要函数/对象的声明在范围内。它可能是可取的,也可能不是(就良好的设计而言),但它应该有效。
【讨论】:
【参考方案4】:我会使用两个重载函数:
int foo(int x, int y);
int foo(int x)return foo(x,bar);
如果您允许内联转发函数,那么性能损失可能会小到零。如果你在非头文件中保持它的主体不符合要求,可能会产生性能成本(可能很小),但实现的灵活性更大并减少了耦合。
【讨论】:
关于使用重载函数的建议很好,但是问题中的代码确实可以正常工作。【参考方案5】:简单地删除第一个声明中的可选参数并提供单个参数重载有什么问题?
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
我认为这往往比尝试使用一些动态默认值更简洁、更灵活。
【讨论】:
【参考方案6】:尝试将 bar() 设为静态成员函数。这将允许程序的任何部分在范围内具有这样的静态类来访问它。例如:
类 Foo 公开:
静态 int bar(); ;
然后你会声明:
int foo(int x, int y = Foo::bar());
如果您需要不同的对象,则改为传入对象的实例。
【讨论】:
【参考方案7】:切向,但在我看来,它会在未来引入依赖问题。我会采用 stbuton.myopenid.com 的方法。
【讨论】:
【参考方案8】:在标准的第 8.3.6 节(默认参数)第 5 段中,他们给出了使用这种方法的示例。具体来说,它指出默认参数是表达式,因此可以应用函数调用,尽管存在名称查找和类型兼容性等限制。
在我的工作场所,我们使用过这样的签名:
void An_object::An_object(
const Foo &a,
const Bar &b,
const Strategem &s = Default_strategem()
);
允许客户端覆盖类构造函数中的行为。它对于影响翻译器性能的条件行为非常有用......
【讨论】:
以上是关于函数调用的结果可以用作默认参数值吗?的主要内容,如果未能解决你的问题,请参考以下文章
将 C++ 函数用作由导出的 Rcpp 函数调用的另一个 C++ 函数的参数