Cos'è questa tecnica di programmazione? (Potenzia libreria)
Domanda
Sto cercando di capire l'esempio da program_options della libreria boost ( http://www.boost.org/doc/libs/1_38_0/doc/html/program_options/tutorial.html#id3761458 )
Soprattutto questa parte:
desc.add_options()
("help", "produce help message")
("compression", po::value<int>(), "set compression level")
;
che cosa sta facendo esattamente qui e quale tecnica è?
Questa parte desc.add_options () potrebbe essere una chiamata di funzione ma come si adatta l'altra () qui? Si tratta di una sorta di sovraccarico dell'operatore?
Grazie!
Soluzione
Il " add_options () " in realtà restituisce un functor , ovvero un oggetto che sostituisce l'operatore (). Ciò significa che la seguente funzione chiama
desc.add_options() ("help", "produce help message");
in realtà si espande in
desc.add_options().operator()("help", "produce help message");
L'operatore " () " restituisce anche un funzione, in modo che le chiamate possano essere concatenate come mostrato.
Altri suggerimenti
Presumibilmente add_options () restituisce una sorta di functor che ha l'operatore () sovraccarico per supportare "concatenamento". (che è una tecnica molto utile, a proposito)
Il sovraccarico (...) consente di creare una classe che si comporta come una funzione.
Ad esempio:
struct func
{
int operator()(int x)
{
cout << x*x << endl;
}
};
...
func a;
a(5); //should print 25
Tuttavia, se fai in modo che operator () restituisca un riferimento all'oggetto , puoi " concatenare " operatori.
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
Poiché a (5) restituisce a, (a (5)) (7) è più o meno identico a a (5); una (7);.