O que é esta técnica de programação? (Aumente Library)
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!
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);
.