Question

J'essaie de comprendre l'exemple de program_options de la bibliothèque boost ( http://www.boost.org/doc/libs/1_38_0/doc/html/program_options/tutorial.html#id3761458 )

Surtout cette partie:

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

que fait-il exactement ici et de quelle technique s'agit-il?

Cette partie desc.add_options () pourrait être un appel de fonction, mais comment l’ajout de other () convient-il ici? Est-ce une sorte de surcharge de l'opérateur?

Merci!

Était-ce utile?

La solution

Le " add_options () " La fonction retourne en fait un foncteur , c'est-à-dire un objet qui remplace l'opérateur (). Cela signifie que l'appel de fonction suivant

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

étend réellement à

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

L'opérateur " opérateur () " renvoie également un foncteur, afin que les appels puissent être chaînés comme vous l'avez montré.

Autres conseils

On peut supposer que add_options () retourne une sorte de foncteur dont operator () est surchargé pour supporter "chaînage". (technique très utile, BTW)

La surcharge (...) vous permet de créer une classe agissant comme une fonction.

Par exemple:

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

...

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

Cependant, si vous faites que operator () retourne une référence à l'objet , vous pouvez "chaîner". opérateurs.

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

Puisque a (5) renvoie a, (a (5)) (7) est plus ou moins identique à a (5); a (7); .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top