Ich versuche, ein Konzept und einen Fehler zu verstehen. Was ist daran falsch?Std :: Funktion mit nicht statischen Elementfunktionen
class A
{
public:
A()
{
std::function<void(int)> testFunc(&A::func);
}
private:
void func(int) {}
}
meine Frage, ist es möglich, jede Art von Objekt zu erstellen, die ein Mitglied einer bestimmten Instanz zu nennen ist in der Lage, wo std :: Funktion wie ein Mitglied Funktionszeiger wirkt, mit der Ausnahme, ohne die verrückte Typdefinition das kann Sie werden nicht als Funktionsparameter in erbenden Klassen verwendet. zum Beispiel:
class A
{
public:
A()
{
index[WM_CREATE] = &A::close;
index[WM_DESTROY] = &A::destroy;
}
protected:
map<UINT msg, void (A::*)(HWND, UINT , WPARAM, LPARAM)> index;
void close(HWND,UINT, WPARAM, LPARAM);
void destroy(HWND, UINT, WPARAM, LPARAM);
};
class B : public A
{
public:
B()
{
index[WM_CREATE] = &B::create; // error because it's not a pointer of type A::*
}
private:
void create(HWND, UINT, WPARAM, LPARAM);
};
Ich denke, ich auf dem richtigen Weg bin der Verwendung von std :: Funktionen wie folgt:
class A
{
public: // Gigantic stl error with these two
A() // |
{ // V
index[WM_CREATE] = std::function<void(HWND, UINT, WPARAM, LPARAM>(&A::close);
index[WM_DESTROY] = std::function<void(HWND, UINT, WPARAM, LPARAM>(&A::destroy);
}
protected:
map<UINT msg, std::function<void(HWND, UINT, WPARAM, LPARAM)> > index;
void close(HWND,UINT, WPARAM, LPARAM);
void destroy(HWND, UINT, WPARAM, LPARAM);
};
class B : public A
{
public: // and this one
B() // |
{ // V
index[WM_CREATE] = std::function<void(HWND, UINT, WPARAM, LPARAM)>(&B::create);
}
private:
void create(HWND, UINT, WPARAM, LPARAM);
};
wenn jemand was bedeuten diese riesigen kryptischen Fehler erklären könnte und wie man repariere sie, ich würde es sehr schätzen.
Wenn Sie sagen "rufen Sie ein Mitglied einer bestimmten Instanz auf, in der sich' std :: function' wie ein Mitgliedsfunktionszeiger verhält ", bedeutet dies, dass die spezifische Instanz zum Zeitpunkt der Erstellung der' std :: -Funktion angegeben wird 'Objekt? Das schlägt die "void (int)" - Signatur vor, aber dann würde das Ergebnisobjekt nicht "wie ein Mitgliedsfunktionszeiger" funktionieren, es würde sich wie ein Callback/Funktor verhalten. Wenn Sie andererseits meinen, dass das resultierende 'std :: function'-Objekt sich tatsächlich wie ein Mitgliedsfunktionszeiger verhält, dann ist die Signatur falsch (z. B. könnte es stattdessen" void (A &, int) "sein). Welches ist es? –
nicht sicher, was ein Callback/Funktor ist, aber es klingt irgendwie wie wir unterscheiden zwischen einer statischen Funktionen und eine nicht-statische Funktionen, und ich möchte es eine nicht-statische Funktion sein. Sie sind Handler, also müssen sie nur diese Instanzmitglieder manipulieren können. Wie in den Beispielen möchte ich, dass diese Funktion aufgerufen wird, wenn der entsprechende Map-Index übergeben wird. Ich möchte einfach folgendes tun: index [WM_CREATE] (hwnd, msg, lparam, wparam); und der einzige Weg, ich denke, dies zu tun, ist Speicherfunktion Zeiger oder etwas ähnliches dort.Ich kann nicht tun, tatsächlich Zeiger, weil es bricht die Vererbung :( – FatalCatharsis
Kannst du nicht ['std :: mem_fun'] (http: //en.cppreference.com/w/cpp/utility/functional/mem_fn) stattdessen? –