Lösung des Problems
Sie können einen Member-Funktionszeiger übergeben, aber dann benötigen Sie eine A
Instanz, um ihn aufzurufen, und eine Mytype*
, die als Parameter übergeben werden soll:
struct Mytype {};
struct A {
bool DoOperation_one(Mytype* pSomeValue) { return true;}
bool DoOperation_two(Mytype* pSomeValue) { return true;}
bool DoOperation_th(Mytype* pSomeValue) { return true; }
};
struct B {
A a;
template <typename F>
bool BMethod(F f,Mytype* mt) {
bool bfun=false;
bool breturn = false;
while (!bfun) {
if ((a.*f)(mt))
{
bfun=true;
breturn = true;//some_other_operation();
}
}
return breturn;
}
};
int main() {
Mytype mt;
B b;
b.BMethod(&A::DoOperation_one,&mt);
}
Anstatt BMethod
eine Vorlage zu erstellen, hätte ich den Typ explizit buchstabieren können, es ist bool (A::*)(Mytype*)
. Die Syntax zum Aufrufen eines Member-Funktionszeigers ist etwas klobig. Wenn a
ein Zeiger auf A
(wie in Ihrem Code) ist, dann ist es (a.->f)(mt)
.
Beachten Sie, dass dies nur sinnvoll ist, wenn sich der von zurückgegebene Wert A::DoOperation_xyz
während B::BMethod
der Ausführung ändert. Zum Beispiel, wenn mehrere Threads beteiligt sind. Wenn dies der Fall ist, müssen Sie beim Synchronisieren des Zugriffs auf gemeinsam genutzte Daten vorsichtig sein, um Datenrennen zu vermeiden. Wenn dies nicht multithreaded ist, sehe ich keinen Grund, es kompliziert zu machen, und BMethod
kann einfach sein bool BMethod(bool x)
.
Keine Kommentare:
Kommentar veröffentlichen