Was ist diese Programmiertechnik? (Boost-Bibliothek)
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!
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);
.