Eine Stärke, die ich sehen kann, aber das kann diskutiert werden, ist, dass die Signatur von operator() über verschiedene Typen hinweg aussieht und sich verhält. Wenn wir einen Klassenreporter mit einem Membermethodenreport (..) und dann einen anderen Klassenwriter hätten, der eine Membermethode write (..) hätte, müssten wir Adapter schreiben, wenn wir beide Klassen als vielleicht verwenden möchten eine Vorlagenkomponente eines anderen Systems. Alles, was es interessiert, ist, Streicher weiterzugeben oder was hast du? Ohne den Einsatz von operator() Überlastung oder spezielle Art Adapter zu schreiben, könnten Sie nicht Sachen wie
T t;
t.write("Hello world");
tun, weil T eine Anforderung hat, dass es eine Memberfunktion namens schreiben, die etwas implizit gießbaren zu const char akzeptiert * (oder besser const char []). Die Reporter-Klasse in diesem Beispiel hat das nicht, daher könnte T (ein Vorlagenparameter), der Reporter ist, nicht kompilieren.
Doch wie weit kann ich sehen, diese mit verschiedenen Arten funktionieren würde
T t;
t("Hello world");
es allerdings nach wie vor verlangt ausdrücklich, dass der Typ T hat ein solcher Operator definiert, so dass wir immer noch eine Anforderung an T. persönlich Ich denke nicht, dass es mit Funktoren zu seltsam ist, da sie häufig verwendet werden, aber ich würde lieber andere Mechanismen für dieses Verhalten sehen. In Sprachen wie C# könnte man einfach einen Delegierten übergeben. Ich kenne mich mit Memberfunktionszeigern in C++ nicht aus, aber ich könnte mir vorstellen, dass Sie dort auch dasselbe Verhalten erreichen könnten.
Anders als das syntaktische Zuckerverhalten sehe ich nicht wirklich die Stärken der Überlastung des Operators, um solche Aufgaben zu erfüllen.
Ich bin sicher, es gibt wissentlichere Leute, die bessere Gründe haben als ich, aber ich dachte, ich würde meine Meinung für den Rest von euch austeilen.
In Verbindung stehende http://stackoverflow.com/questions/356950/c-functors-and-their-uses? – Konrad