2011-01-05 8 views
1

ich so etwas wie eine Art-Algorithmus haben, ist hier, und ich möchte es einen Funktor übergeben, die die Sortierkriterien (std bietet :: binäre_funktion). So sollte es T.operator <() zum Beispiel anrufen, wenn std :: less gegeben ist.Wie ein std-Funktors in c passieren ++ und es verwenden, ohne zu wissen, welche es speziell

Problem ist, ist die Elementfunktion Operator() nicht virtuell ist. Also muss ich wissen, welche Art von Objekt gegeben wurde, um eine dynamische Besetzung zu machen, die nicht wirklich nett ist.

Regards,

Dennis

Antwort

6

Problem ist, nicht die virtuelle Mitgliedsfunktion Operator() ist. Also muss ich wissen, welche Art von Objekt gegeben wurde, um eine dynamische Besetzung zu machen, die nicht wirklich nett ist.

Warum möchten Sie einen dynamischen Cast durchführen? Normalerweise brauchst du das nicht. Rufen Sie einfach die Funktor operator() genau wie Sie eine normale Funktion nennen würden.

Der springende Punkt eines Funktors ist, dass sie sich wie normale Funktionen verhalten und Sie einen Template-Parameter in Ihren Algorithmus übergeben (oder nicht?), Um verschiedene Funktor- (und Funktions-) Typen zu behandeln.

Natürlich ist diese ganze Sache auf der Tatsache basiert, dass Sie sind übergeben tatsächlich einen Template-Parameter in Ihre Funktion. std::binary_function ist nicht geeignet als virtuelle Basisklasse. Es existiert lediglich, um ein paar handliche Typdefinitionen zu definieren. Daher sollten Sie Ihre Funktionsdeklaration wie folgt aussehen:

template <typename TBinaryFunction> 
void your_algorithm(rest of parameters …, TBinaryFunction f); 
+0

ich will nicht dynamic_cast verwenden ... aber ich auch kippe Verwendung operator(), weil im lokalen Kontext, es binary_function ist, die keinen Operator() definiert haben. afaik du musst es zuerst überladen, um es zu benutzen ... – Dennis

+2

@Dennis: dann bist du missbrauchen 'binary_function'. Wie ich in meiner Antwort gesagt habe, war es nie als polymorphe Basisklasse gedacht. Es definiert nur ein paar nützliche typedefs, nichts mehr. Sie können eine 'binary_function' nicht sinnvoll in eine andere Funktion übergeben, das sollte nicht funktionieren. –

+0

ok thx.May du ein Beispiel? (link?) ich wollte binary_function als unspezifizierte superklasse verwenden, damit jeder compare-functor aus der STL verwendet werden kann ... ich verstehe hier nicht wirklich, wie man eine template verwendet. – Dennis

0

können Sie Qt Signal verwenden und Slots oder Sie können Boost.Function verwenden

1

Können Sie nicht Ihre Funktors als Template-Parameter übergeben, so haben statischer Polymorphismus?

+0

Ziemlich sicher, dass diese besondere Verwendung von Vorlagen nicht statische Polymorphie ist. – Puppy

Verwandte Themen