2016-06-07 16 views
0

Sehr geehrte stackoverflow Benutzer.Vorteile der Verwendung von Std :: Funktion

Ich habe versucht, die Vorteile von std::function zu finden, und warum ich es anstelle von Funktoren oder Zeigern verwenden sollte. Leider habe ich keine befriedigende Antwort gefunden.

Deshalb werde ich sehr schätzen, wenn Sie mir sagen würden, welche Vorteile std::function sind, und wann sollte ich es verwenden. Ich hoffe, dass meine Frage auch anderen hilft.

+4

Gute Erklärung ist [Die Wichtigkeit von std :: function] (https://problablydance.com/2012/12/16/the-importance-of-stdfunction/). In Verbindung stehende Artikel: [Warum verwenden wir std :: function ...] (http://stackoverflow.com/questions/11352936/why-do-we-use-stdfunction-in-c-rather-than-the-original -c-function-pointer) und [Soll ich std :: function verwenden ...] (http://stackoverflow.com/questions/25848690/should-i-use-stdfunction-or-a-function-pointer-in -c). – Jens

Antwort

5

std::function implementiert eine Technik Typ-Löschung wegen dem Sie können Speicherjede aufrufbaren Entität in std::function, sei es functors, Member-Funktionen genannt, oder freie Funktionen — Sie können sogar storeMitgliedschaft Daten als auch das scheint intuitiv entgegen!

Hier ist ein Beispiel, das ohne std::function ( oder Typ-Löschung) nicht durchgeführt werden kann:

std::vector<std::function<void()>> funs; 
for(int i = 0; i < 10; ++i) 
    funs.push_back([i] { std::cout << i < std::endl; }); 

for(auto const & f: funs) 
    f(); 

Hier ist ein weiteres Beispiel, das Mitgliedsdaten speichert:

struct person 
{ 
    std::string name; 
}; 

int main() 
{ 
    std::vector<person> people { 
     {"Bjarne"}, 
     {"Alex"} 
    }; 

    std::function<std::string(person const&)> name (&person::name); 

    for(auto const & p : people) 
     std::cout << name(p) << std::endl; 
} 

Ausgang (demo):

Bjarne 
Alex 

Hoffe, dass hilft.

+1

'function name (& person :: name);' - Sie täuschen den Compiler mit eigenen Kräften! – Ajay

1

Der Punkt von std::function ist, Typ-Löschung über ein generisches aufrufbares Objekt mit irgendeinem gegebenen Prototyp zur Verfügung zu stellen. Sie verwenden es, wenn Sie möchten, dass Ihre Funktion/Ihre Klasse/was auch immer ein generisches, aufrufbares Objekt mit einer bestimmten Signatur (sei es ein Funktionszeiger, ein Funktor oder ein Lambda) erhält, ohne dass die gesamte Vorlage über den Typ einer solchen aufgerufen werden muss.

Auch gibt es Situationen, wo sogar alles Vorlage nicht helfen würde; Denken Sie daran, einen Vektor von heterogenen "Sachen" zu haben, die aufgerufen werden können, zum Beispiel ein signalähnliches Objekt. Ohne diese Art des Löschens ist es im Wesentlichen unmöglich.

Verwandte Themen