2013-02-24 12 views
7

Ich habe eine C++ - Klasse namens Graph, und es hat eine Algorithmus-Methode for_each_node(). Ich kann es entweder eine Vorlage machen, wie folgt aus:Algorithmus-Funktion: Machen Sie es zu einer Vorlage oder nehmen Sie einen std :: function-Parameter?

template <class UnaryFunction> 
UnaryFunction Graph::for_each_node (UnaryFunction f) 
{ 
    /* ... */ 
} 

oder std :: Funktion, wie diese machen verwenden:

typedef std::function<void (Node&)> ForEachNodeFunc; 

ForEachNodeFunc Graph::for_each_node (ForEachNodeFunc f) 
{ 
    /* ... */ 
} 

Standard-Algorithmen, zum Beispiel std :: for_each, verwende den ersten Ansatz, während einige Bibliotheken, z.B. gtkmm (das ist die C++ - Bindung von GTK +), nimmt Funktionen als Funktionszeiger von Objekten an, die sie enthalten.

Was sind die Vor- und Nachteile jeder Option? Ich bin mir nicht sicher, welches ich wählen soll. Was sollte die Auswahl beeinflussen: ob meine Graph-Klasse eine Klassenvorlage ist oder wie viele verschiedene Funktionen mit der Algorithmusmethode oder den Geschwindigkeitsanforderungen verwendet werden sollen?

Antwort

5

Werfen Sie einen Blick auf diese Antwort von Andy Schleichen, glaube ich es auch zum Teil die Antwort auf Ihre Frage ist:

Im Allgemeinen, wenn Sie ein Design Situation konfrontiert sind, dass Sie eine Wahl, Vorlagen gibt. ..

https://stackoverflow.com/a/14678298/1758762 (std :: function vs template)

+1

ich verstehe ... dann nutzen Sie die std :: Funktion eine polymorphe Wrapper wird, und wenn Polymorphismus nicht benötigt wird, Vorlagen sind in der Regel bevorzugt, – cfa45ca55111016ee9269f0a52e771

Verwandte Themen