Pass-und Aufruf einer member-Funktion (boost::bind / boost::function?)
Ich habe eine wahrscheinlich embarassingly einfaches problem: übergeben und der Aufruf einer member-Funktion einer Klasse. Ich weiß, ich will BOOST bind (und-oder-Funktion), aber ich habe nicht wirklich Begriffen, um es noch.
Den folgenden code kompiliert und ausgeführt, mit dem problem. Aber wenn ich ändern möchten die "f3" - Funktion, um eine nicht-statische Klasse Funktion, dann beginnt der Spaß:
#include <iostream>
#include <inttypes.h>
#include <boost/bind.hpp>
#include <boost/function.hpp>
class Test
{
public:
void f1();
private:
void f2(void (*callfunc)(uint32_t));
static void f3(uint32_t x);
};
void Test::f1(){
f2(f3);
}
void Test::f2(void (*callfunc)(uint32_t)){
(*callfunc)(42);
}
void Test::f3(uint32_t x){
std::cout << "x: " << x << std::endl;
}
int main(int argc, char ** argv)
{
Test ct;
ct.f1();
return 0;
}
Nun, nach der änderung
static void f3(uint32_t x);
zu
void f3(uint32_t x);
den compiler ist nicht glücklich, und sagt mir "Fehler: keine passende Funktion für Aufruf von" Test::f2()'"
Gelesen hatte, durch eine Reihe von SO posts zu boost::bind und boost::function, ich glaube, ich muss zum ändern der definition von f2() und wie f1 () - Aufrufe f2() geben die f3-Taste() als Ziel zu nennen, aber davon abgesehen, ... über jede Kombination von boost::bind und boost-Funktion, die ich habe versucht, kläglich versagt zu kompilieren.
Wie muss ich dies schreiben? Als bonus-Frage: gibt es irgendwelche einfachen einführenden liest auf boost::bind und boost::function? Die BOOST-docs nicht wirklich mir da helfen.
B.
InformationsquelleAutor BaCh | 2011-03-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
boost::function ist eine template-Klasse, die eine Funktion Unterschrift. Sie können auch function0, function1, etc.
boost::function< void(uint32_t) >
definiert ein "callable", das aussieht wie eine Funktion, d.h. es nimmt einen einzelnen parameter vom Typ
uint32_t
und gibt void zurück.Den entsprechenden nummerierten Vorlage ist
function1< void, uint32_t >
. Diese immer auf den return-Typ, dann die Parameter in der Reihenfolge.boost::bind
ist eine sehr spezielle Funktion, leitet die Argumente, die Sie gehen in es und erzeugt einen Funktor für Sie.Wird es nicht schaffen, eine leere(uint32_t) für Sie, es wird etwas erschaffen, das das Muster ein.
Daher ändere deine Signatur:
Dann können Sie es so nennen:
Hinweis: die seltsame _1 ist ein "Platzhalter", erzählt boost::bind, wo es braucht, um in die parameter, in diesem Fall die
uint32_t
InformationsquelleAutor CashCow
Erste, ich 'll erklären, der Grund, dass das entfernen der
static
gibt Ihnen einen Kompilierungsfehler:Werfen Sie einen Blick auf diese Signatur:
Dies ist ein Zeiger auf free Funktion, die einen
uint32_t
und zurückvoid
. Wennf3
deklariert ist innerhalbTest
alsdann
f3
ist eine member-Funktion der KlasseTest
, nimmt eineuint32_t
und zurückvoid
. Es ist daher nichtf3
entspricht der Typ des Arguments, dassf2
erwartet.Als für wie
boost::function
undboost::bind
können verwendet werden, um eine Lösung bereitzustellen:Update:
Schließlich über ein tutorial: ich fand diese nützlich, wenn das lernen von funktoren (was
boost::function
ist undboost::bind
gibt) in der Vergangenheit. Es erwähnt nicht, dassboost
speziell, aber wenn Sie verstehen, was genau Los ist, in einer unteren Ebene finden Sie mitboost
ein Kinderspiel.Ja, genauso fing es ein paar Minuten vor, da ich nicht kompilieren.
Wenn ich könnte würd ich auch akzeptiere deine Antwort, wie ist der link zu dem Funktor Einführung. CashCow ' s Antwort war ein bisschen mehr abgeschlossen, obwohl mit angezeigt wird die Signatur von f2 () - (das war deutlich genug für mich aus deiner Antwort, aber vielleicht nicht für andere). Anyway, ich danke Ihnen sehr für die Antwort und den link.
Keine Sorge. Ich wusste nicht, berühren Sie die Unterschrift von
f2
auf Zweck, aber wenn eine andere Antwort sieht Sie besser aus, dann sollten Sie unbedingt annehmen. Ich würde nicht dagegen, ein upvote obwohl 😉InformationsquelleAutor Jon