C ++多个参数集在函数调用时有自己的括号?

时间:2018-06-13 19:23:52

标签: c++ function

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

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

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

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

他们是怎么做到的?这个语法有名称吗?

1 个答案:

答案 0 :(得分:5)

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);

<强> PS

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

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

IMO可以更清楚地理解这一点。