【问题标题】:How to only use some of the optional arguments of a function如何只使用函数的一些可选参数
【发布时间】:2021-05-13 04:00:11
【问题描述】:

有没有办法只使用函数的一些可选参数? 所以如果我有这样的功能,

void f(int a = 0, int b = 1) {}

我可以调用f() 并仅指定b 并将a 保留为默认值吗?

【问题讨论】:

  • 不,你不能。
  • 这能回答你的问题吗? stackoverflow.com/questions/8262887/…
  • 没有语法来做你想做的事:你可以省略参数的“尾巴”,但是一旦你在位置i设置了一个参数,它之前的所有东西都必须设置.
  • @largest_prime_is_463035818 不是真的
  • C++ 语法从 C 继承了它的函数调用规则,它只使用实参和形参之间的位置关联。因此可以省略尾随默认参数,但不能省略前导默认参数。

标签: c++ function


【解决方案1】:

我希望。 C++ 缺少其他语言(如 C# 或 Python)中常见的这一特性。

目前,您要么非常聪明地设计参数的顺序,要么将参数重构为一个小结构:

struct f_args
{
   int a = 0;
   int b = 1;
};

现在你可以随意设置任何你想要的:

void f(f_args args){/*...*/};

// ...
f_args args;
args.b = 2;
f(args);

或者使用designated initializers (C++20):

f({.b=2});

The Boost parameter library 试图以更强大的方式解决这个问题。

【讨论】:

  • 谢谢,这看起来不错的解决方法
  • @user11914177:这也是 Vulkan API 决定为其 API 采用的方式。这样做的好处是它对重新排序或添加新参数非常健壮。此外,现在您有了一个类,您可以通过为f_args 创建例如流畅的接口来设置您想要的参数,或者将参数的创建推送到最终生成适当的f_args 对象。
  • 我从来没有得到其他地方建议的named parameter idiom 的意思,像这样“命名参数”更简单,更简洁恕我直言。
  • @largest_prime_is_463035818:这种方式会很烦人,尤其是对于非常明显的功能(例如,添加,您不想每次添加新的 args 结构)。但是,“命名参数习语”(也称为流式接口模式)可用于参数构建,例如强制执行必需/可选参数。
  • 在 C++20 中,由于指定的初始化语法,调用也可以是单行的。 Example.
猜你喜欢
  • 2013-04-08
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
相关资源
最近更新 更多