Что это за метод программирования?(Библиотека повышения)

StackOverflow https://stackoverflow.com/questions/809827

  •  03-07-2019
  •  | 
  •  

Вопрос

Пытаюсь понять пример из program_options библиотеки boost (http://www.boost.org/doc/libs/1_38_0/doc/html/program_options/tutorial.html#id3761458)

Особенно эта часть:

desc.add_options()
    ("help", "produce help message")
    ("compression", po::value<int>(), "set compression level")
;

что именно он здесь делает и что это за техника?

Эта часть desc.add_options() могла бы быть вызовом функции, но как сюда вписывается другая ()?Это какая-то перегрузка оператора?

Спасибо!

Это было полезно?

Решение

Функция add_options() фактически возвращает функтор, то есть объект, который переопределяет оператор ().Это означает, что следующий вызов функции

desc.add_options() ("help", "produce help message");

на самом деле расширяется до

desc.add_options().operator()("help", "produce help message");

Оператор() также возвращает функтор, так что вызовы можно объединить в цепочку, как вы показали.

Другие советы

Предположительно add_options() возвращает какой-то функтор, в котором оператор() перегружен для поддержки «цепочки» (что, кстати, очень полезный метод).

Перегрузка (...) позволяет создать класс, который действует как функция.

Например:

struct func
{
    int operator()(int x)
    {
        cout << x*x << endl;
    }
};

...

func a;
a(5); //should print 25

Однако, если вы заставите оператор() вернуть ссылка на объект, то вы можете «связать» операторы.

struct func
{
    func& operator()(int x)
    {
        cout << x*x << endl;
        return *this;
    }
};

...

func a;
a(5)(7)(8); //should print 25 49 64 on separate lines

Поскольку a(5) возвращает a, (a(5))(7) более или менее идентично a(5); a(7);.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top