2013-02-24 9 views
7

Ho una classe C++ chiamata Graph e ha un metodo algoritmo for_each_node(). Posso o farne un modello, come questo:Funzione Algoritmo: crea un modello o utilizza un parametro std :: function?

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

o renderlo utilizzare std :: funzione, in questo modo:

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

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

algoritmi standard, per esempio std :: for_each, usa il primo approccio, mentre alcune librerie, ad es. gtkmm (che è il binding C++ di GTK +), usa le funzioni come puntatori di funzione degli oggetti che li contengono.

Quali sono i vantaggi e gli svantaggi di ciascuna opzione? Non sono sicuro di quale scegliere. Che cosa dovrebbe influenzare la scelta: se la mia classe Graph è un modello di classe, o quante funzioni differenti dovrebbero essere utilizzate con il metodo dell'algoritmo, o requisiti di velocità?

risposta

5

Date un'occhiata a questa risposta da Andy Prowl, penso che sia in parte la risposta alla tua domanda così:

In generale, se si trovano ad affrontare una situazione di progettazione che consente di scegliere, utilizzare i modelli. ..

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

+1

Capisco ... quindi il vantaggio di std :: funzione è essere un wrapper polimorfico, e quando non è necessario il polimorfismo, i modelli sono generalmente preferibili – cfa45ca55111016ee9269f0a52e771