1

Ich verwende std::deque, um Rückruffunktionen zu behalten.Wie entfernt man den Funktionszeiger von std :: deque by val?

Alles funktioniert einwandfrei, außer das Entfernen eines bestimmten Rückrufs.

typedef std::function<void(void)> cb_Action; 
std::deque<cb_Action> actionCallbacks; 

Ich kann Elemente eins nach dem anderen hinzufügen oder alle ohne Probleme löschen.

Aber ich kann nicht einen spezifischen Rückruf von dem deque Variable entfernen.

actionCallbacks.erase (std::remove(actionCallbacks.begin(), actionCallbacks.end(), callbackToRemove), actionCallbacks.end()); 

Es gibt Zeitfehler kompilieren:

binary '==': no operator found which takes a left-hand operand of type:'std::function<void(void)>' (or there is no acceptable conversion) 

Also, wie kann ich ein bestimmtes cb_Action entfernen?

+1

Dies liegt daran, dass std :: function nicht miteinander verglichen werden kann. Die einzige Überladung für den Operator == und! = Sind diejenigen, die mit nullptr verglichen werden. –

+0

Ich denke, Sie sollten Struktur speichern, die Callback und seine Handler enthalten, z. size_t id, und wenn Sie bestimmte Callback entfernen möchten, sollten Sie seinen Handler – stryku

+0

@stryku: Ich denke, Sie meinen "enthält Callback und seine Handle". Ein "Handler" (Substantiv) ist eine Sache, die etwas "handhabt" (verb). Ein Callback wäre eine typische Möglichkeit, einen Handler in C++ zu schreiben. Ein "Handle" ist (unter anderem) eine Möglichkeit, auf ein Objekt zu verweisen. –

Antwort

1

Wenn Sie mit den üblichen Funktionen umgehen können Sie so etwas wie dies auf std::function::target basiert tun:

void callback_1(void) {} 
void callback_2(void) {} 

actionCallbacks = { 
    std::function<void(void)>(callback_1), 
    std::function<void(void)>(callback_2), 
    std::function<void(void)>(callback_1) 
}; 

actionCallbacks.erase(
    std::remove_if(actionCallbacks.begin(), actionCallbacks.end(), [](cb_Action action) { 
     return (*action.target<void(*)(void)>() == callback_1); 
    }), 
    actionCallbacks.end() 
); 

Hier werden alle Artikel mit callback_1 innen entfernt werden.

+0

Das schafft das gleiche Problem. Es vergleicht 'std :: function ' mit einer anderen 'std :: function '. callback_1 aus Ihrem Beispiel wird zurück zu actionCallbacks verschoben. Daher kann ich callback_1 nicht direkt in der Vergleichsmethode verwenden und wenn ich cb_Action verwende, funktioniert das immer noch nicht. – frankish

+0

@frankish Ich kann nicht sicher verstehen, was meinst du, tut mir leid. Diese Methode vergleicht Zeiger auf Funktionen in einer absolut gültigen Weise. Warum können Sie 'callback_1' nicht direkt verwenden? –

Verwandte Themen