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!

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top