2017-12-22 1 views
0

Ich habe eine Liste von Objekten, wo ich eine Member-Funktion aufrufen muss - keine große Sache bisher: Iterieren durch die Liste, diesen Aufruf - fertig.Rufen Sie eine Objekt-Member-Funktion auf einer Liste von Objekten mit std :: function

Jetzt habe ich verschiedene Orte, die fast das gleiche auf der gleichen Liste, außer dass die aufgerufene Member-Funktion ändert (Argument ist immer das gleiche, ein doppelter Wert).

Ich versuchte ein bisschen mit std :: Funktion, aber am Ende kann es nicht funktionieren. Irgendwelche Vorschläge? (Ich bin nach vielen Jahren C# zurück in C++, habe also viel vergessen).

Dies ist, wie es jetzt aussieht:

void CMyService::DoSomeListThingy(double myValue) 
{ 
    for (std::list<CMyListItem*>::iterator v_Iter = myList.begin(); v_Iter != myList.end(); ++v_Iter) 
    { 
     (*v_Iter)->MethodToBeCalled(myValue); 
    } 
} 

void CMyService::DoSomeThingDifferent(double myValue) 
{ 
    for (std::list<CMyListItem*>::iterator v_Iter = myList.begin(); v_Iter != myList.end(); ++v_Iter) 
    { 
     (*v_Iter)->CallTheOtherMethod(myValue); 
    } 
} 

Und das ist, wie ich es vorziehen würde:

void CMyService::DoSomeListThingy(double myValue) 
{ 
    ApplyToList(&CMyListItem::MethodToBeCalled, myValue); 
} 

void CMyService::DoSomeThingDifferent(double myValue) 
{ 
    ApplyToList(&CMyListItem::CallTheOtherMethod, myValue); 
} 

void CMyService::ApplyToList(std::function<void(double)> func, double myValue) 
{ 
    for (std::list<CMyListItem*>::iterator v_Iter = myList.begin(); v_Iter != myList.end(); ++v_Iter) 
    { 
     (*v_Iter)->func(myValue); 
    } 
} 

Antwort

3
void CMyService::ApplyToList(void (CMyListItem::*func)(double), double myValue) { 
    for (auto p : myList) { 
     (p->*func)(myValue); 
    } 
} 

Mit 11 Compiler ++ Pre-C:

void CMyService::ApplyToList(void (CMyListItem::*func)(double), double myValue) { 
    for (std::list<CMyListItem*>::iterator v_Iter = myList.begin(); 
     v_Iter != myList.end(); ++v_Iter) { 
    ((*v_Iter)->*func)(myValue); 
    } 
} 
+0

sieht sehr einfach aus, verwenden jedoch mit VS2010 verwenden sie Probleme haben; könnte es sein, dass es nicht unterstützt wird? –

+0

Eine Variante hinzugefügt, die keine C++ 11-Funktionen verwendet. –

+0

Ausgezeichnet, der zweite hat es für mich gelöst. –

0

Sie könnten lambdas

void CMyService::ApplyToList(std::function<void(CMyListItem*, double)> func, double myValue)) 
{ 
    for (std::list<CMyListItem*>::iterator v_Iter = myList.begin(); v_Iter != myList.end(); ++v_Iter) 
    { 
     func(*v_Iter, myValue); 
    } 
} 

und

double val; 
std::function<void(A*,double)> fun1 = [=](A *th,double) { 
                th->foo(val); 
               }; 

std::function<void(A*,double)> fun2 = [=](A *th,double) { 
                th->bar(val); 
               }; 
ApplyToList(fun1, val); 
ApplyToList(fun2, val); 
Verwandte Themen