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?
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