【问题标题】:C++ multiple sets of parameters with their own parentheses on function call?C++ 多组参数在函数调用时带有自己的括号?
【发布时间】:2018-06-13 19:23:51
【问题描述】:

我已经用 C/C++ 编写代码一段时间了,我正在使用https://github.com/jarro2783/cxxopts 库。该库使用 add_options() 函数来获取它的配置,如下所示:

options.add_options() ("option1", "Description1") ("option2", "Description2");

您可以添加任意数量的选项。

令人惊讶的是,这是有效的 C/C++ 并且有效;我从来没有见过这样的东西。

他们是怎么做到的?这种语法有名字吗?

【问题讨论】:

  • 看过源码了吗?
  • 重载function call operator并链接。
  • 这很可能是通过使用具有operator() 的类型来完成的,该类型返回相同类型的实例。
  • 实际上是Named Parameter Idiom的一个变种,它出现了。
  • 您可能希望使用 C 或 C++ 进行编程。在两者之间切换有时会很烦人,此外,没有 C/C++ 语言。例如,在 C 中,您没有成员函数,也不能重载函数或运算符。

标签: c++ function


【解决方案1】:

options.add_options() 返回一个对象。

该对象具有函数调用运算符重载,它接受两个字符串,很可能看起来像

ObjectType& operator()(std::string const& option, std::string const& value);

它允许您链接函数调用。

这是一个演示这个概念的简单程序。

#include <iostream>

struct Foo
{
   Foo& operator()(int x)
   {
      std::cout << "Got " << x << std::endl;
      return *this;
   }
};

struct Bar
{
   Foo getFoo() { return Foo(); }
};


int main()
{
   Bar b;
   b.getFoo()(10)(200)(30);
}

程序的输出:

Got 10
Got 200
Got 30

main 中的那一行相当于:

Foo foo = b.getFoo();
foo(10);
foo(200);
foo(30);

附言

就个人而言,我发现这种编码风格有点神秘,最好避免。我宁愿看到:

auto& option = options.add_options();
option.addOption("option1", "Description1");
option.addOption("option2", "Description2");

这更容易理解,IMO。

【讨论】:

  • 太棒了,以后一定会用这个!
  • @DanyAlejandro 虽然我理解语法,但我不鼓励这种编码风格。
  • 是的,从使用 JSON 对象到在 JavaScript 中设置函数调用,我都认识到了这种风格,非常实用,这也是让我如此兴奋的原因。但其他 C++ 程序员可能不同意,我也不想强迫人们去 google 阅读我的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 2019-10-26
  • 2021-07-25
  • 2011-11-02
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
相关资源
最近更新 更多