Pergunta

I'am tentando entender o exemplo da program_options da biblioteca de impulso ( http://www.boost.org/doc/libs/1_38_0/doc/html/program_options/tutorial.html#id3761458 )

Especialmente esta parte:

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

o que exatamente ele está fazendo aqui e qual técnica é que?

Esta parte desc.add_options () poderia ser uma chamada de função, mas como fazer a outra () se encaixam aqui? Isso é algum tipo de sobrecarga de operador?

Obrigado!

Foi útil?

Solução

Os "add_options ()" função realmente retorna um functor , isto é, um objeto que substitui o operador (). Isto significa que a seguinte chamada de função

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

realmente expande para

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

O "operador ()" também retorna um functor, de modo que as chamadas podem ser encadeadas como você tem mostrado.

Outras dicas

Presumivelmente add_options () retorna algum tipo de functor que tem operator () sobrecarregado para suporte "encadeamento" (que é uma técnica muito útil, BTW)

Sobrecarga (...) permite-lhe criar uma classe que age como uma função.

Por exemplo:

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

...

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

No entanto, se você fizer operator () retorna um referência ao objeto , então você pode "cadeia" operadores.

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

Uma vez que um (5) devolve um, (a) (5) (7) é mais ou menos idêntico ao a(5); a(7);.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top