Verwenden Sie std::function, es sei denn, es gibt einen zwingenden Grund, dies nicht zu tun
Bei der Arbeit mit Callback-Funktionen in C besteht die Wahl zwischen der Verwendung von a Funktionszeiger im C-Stil und die neuere std::function können umstritten sein. Lassen Sie uns die Vor- und Nachteile jeder Option untersuchen.
C-Style-Funktionszeiger:
std::function:
Wann man std::function verwendet:
In den meisten Fällen ist std::function die bevorzugte Wahl. Es ist flexibler und zukunftssicherer als Funktionszeiger. Sofern keine besonderen Leistungsbedenken bestehen, wird im Allgemeinen empfohlen, std::function zum Weiterleiten von Rückrufen zu verwenden.
Wann Funktionszeiger verwendet werden sollten:
Wenn die Leistung von entscheidender Bedeutung ist Wenn Sie dies berücksichtigen und die Rückruffunktion keine Kontextvariablen erfassen muss, ist ein Funktionszeiger möglicherweise die bessere Option. Dieses Szenario kommt jedoch relativ selten vor.
Dritte Option: Vorlagenparameter
Erwägen Sie die Verwendung eines Vorlagenparameters, wenn die Rückruffunktion ein beliebiges aufrufbares Objekt sein soll. Dieser Ansatz bietet Flexibilität, erfordert jedoch die Implementierung der äußeren Funktion im Header.
Zusammenfassungstabelle:
Feature | Function Pointer | std::function | Template Parameter |
---|---|---|---|
Can capture context | No | Yes | Yes |
Call overhead | None | Small | None |
Can be inlined | No | No | Yes |
Can be stored in class member | Yes | Yes | No |
Implemented outside of header | Yes | Yes | No |
Supported without C 11 standard | Yes | No | Yes |
Readability | Poor | Good | Fair |
Schlussfolgerung:
Im Allgemeinen überwiegen die Vorteile von std::function die von Funktionszeigern. Es ist flexibler, zukunftssicherer und lesbarer. Verwenden Sie Funktionszeiger nur, wenn ein bestimmtes Leistungsproblem besteht oder wenn die Rückruffunktion keine Kontextvariablen erfassen muss.
Das obige ist der detaillierte Inhalt vonstd::function vs. Funktionszeiger: Wann sollten Sie was wählen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!