Что это за техника программирования? (Boost Library) - PullRequest
4 голосов
/ 01 мая 2009

Я пытаюсь понять пример из 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 () может быть вызовом функции, но как здесь подходит другой ()? Это какая-то перегрузка оператора?

Спасибо!

Ответы [ 2 ]

14 голосов
/ 01 мая 2009

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

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

фактически расширяется до

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

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

11 голосов
/ 01 мая 2009

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

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

Например:

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

...

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...