Frage

Ich bin versucht, das Beispiel von program_options der Boost-Bibliothek ( http://www.boost.org/doc/libs/1_38_0/doc/html/program_options/tutorial.html#id3761458 )

Gerade dieser Teil:

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

, was genau er hier und die Technik ist das?

Dieser Teil desc.add_options () könnte ein Funktionsaufruf sein aber wie die andere () hier passen? Ist das eine Art von Überladen von Operatoren?

Danke!

War es hilfreich?

Lösung

Der "add_options ()" Funktion tatsächlich gibt ein Funktors , das heißt, ein Objekt, das überschreibt den Operator (). Dies bedeutet, dass der folgenden Funktionsaufruf

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

tatsächlich expandiert nach

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

Der „Operator ()“ gibt auch einen Funktor, so dass die Anrufe verkettet werden können, wie Sie gezeigt haben.

Andere Tipps

Vermutlich add_options () gibt eine Art von Funktors, den operator () überlastete zu unterstützen "Chaining" hat (was eine sehr nützliche Technik ist, BTW)

Overloading (...) ermöglicht es Ihnen, eine Klasse zu erstellen, die wie eine Funktion handelt.

Zum Beispiel:

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

...

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

Wenn Sie jedoch machen Operator () gibt einen Verweis auf das Objekt , dann können Sie "Kette" Operatoren.

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

Da a (5) ergibt a, (a (5)) (7) ist mehr oder weniger identisch mit a(5); a(7);.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top