Что это за метод программирования?(Библиотека повышения)
Вопрос
Пытаюсь понять пример из 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);
.