2012-04-13 15 views
1

Ich habe zwei überladene Elementfunktionen mit den folgenden Signaturen:boost :: bind mit überladenen Funktionen?

class MyClass 
{ 
    void f(int, int, int); 
    void f(int, int, int, double); 
}; 

I boost bin mit :: bind wie folgt:

boost::bind(&MyClass::f, _1, 1, 2, 3); // _1 is a placeholder for the implicit parameter 

Mein Problem ist eigentlich, dass es kein Problem ist. Laut Boost :: Bind-Dokumentation (um http://www.boost.org/doc/libs/1_49_0/libs/bind/bind.html#err_overloaded) sollte dies "normalerweise" zu einem Fehler führen, und ich sollte auf den Funktionszeigertyp umwandeln müssen. Mein Code wird jedoch ohne Fehler kompiliert und scheint wie erwartet zu funktionieren.

Das Beispiel in der Dokumentation ist einer, wo der einzige Unterschied in den überladenen Funktionen ist, dass der eine const ist, während der andere nicht ist. Meine Vermutung ist daher, dass ich kein Problem habe, weil der Compiler den Unterschied zwischen den beiden überladenen Funktionen erkennen kann, weil die Anzahl (und Typen) von Argumenten unterschiedlich ist, während im Beispiel der Dokumentation kein Weg für die Compiler, um zu sagen, welche Version Sie beabsichtigen, einfach aus den an boost :: bind übergebenen Argumenten. Andererseits bin ich skeptisch gegenüber meiner Vermutung, weil ich in Frage stelle, wie der Compiler weiß, dass die letzten 3 Argumente, die in meinem Beispiel an boost :: bind übergeben werden, mit dem Funktionszeiger im ersten Argument verknüpft sind (und daher Teil seiner Signatur sind)) - es scheint mir, dass dies eine interne Angelegenheit für boost :: bind ist, von der der Compiler keine Kenntnis haben sollte.

Weder die Dokumentation noch andere Ratschläge, die ich beim googlen dieses Problems finden kann, geben an, dass es nur ein Problem mit überladenen Funktionen gibt, die die gleichen Argumenttypen haben. Also wäre ich dankbar, wenn jemand bestätigen könnte, dass meine Vermutung richtig ist (und implizit, warum meine Skepsis falsch ist), bevor ich mich auf meinen Code unter der (möglicherweise falschen) Annahme stütze, dass er gültig ist. Meine Sorge ist, dass der Compiler einfach die zu bindende Funktion basierend auf der Argumentation wählt, die ich z. das erste auswählend, das es rüberkommt.

+0

Mit welchem ​​Compiler können Sie '& MyClass :: f' ohne Disambiguierung ausführen? – ildjarn

+0

MS Visual C++ 2005 – JBentley

+1

Verwenden Sie ein altes Toolset auf _purpose_? ; -] – ildjarn

Antwort

3

Wenn es nur eine Auswahl gibt, die semantisch korrekt ist, dann geht es Ihnen gut (wie in Ihrem Beispiel). Wenn es mehr gibt, raten Sie nicht, was es auswählen wird, wählen Sie dafür (wie im Beispiel von Boost).
Da bind, wie alles andere in C++, stark typisiert ist, kann der Compiler nicht nur die Funktion oder etwas verkleinern, damit es nicht unmöglich wird, wählen Sie die erste in Ihrem Beispiel.

+0

Ok Ich denke, ich sehe, was Sie bekommen. Wenn ich boost :: bind betrachte, kann ich sehen, dass es 77 Versionen davon gibt. Ich vermute, dass sie eine Version für jede zulässige Anzahl von Parametern (bis zu einer gewissen Obergrenze) für die Funktion, die an sie übergeben wird, gemacht und den Typ des Funktionszeigerparameters mit den Typen der anderen Parameter in jedem verknüpft haben Fall, dass, wenn der Compiler wählt, welche Funktion übergeben wird, muss es den gleichen Typ übereinstimmen? – JBentley

Verwandte Themen