2012-12-19 24 views
18

Eventuali duplicati:
Should templated functions take lambda arguments by value or by rvalue reference?Passare i funtori in base al valore o in C++ 11 Riferimento universale?

Il C++ funzioni della libreria standard prendono funtore (puntatore a funzione o oggetto funzione) argomenti per valore, in questo modo:

template <typename F> 
void apply(F func) 
{ 
    func(); 
} 

.. . Ma non sarebbe meglio passare i funtori di Universal Reference? In questo modo:

template <typename F> 
void apply(F&& func) 
{ 
    func(); 
} 

In questo modo si poteva passare oggetti funzione che mantengono lo stato, e avere accesso a questo stato (eventualmente modificato) dopo la funzione di ordine superiore è tornato.

+0

I modelli vengono espansi/risolti al momento della compilazione. Come possono sapere lo stato al momento della compilazione? –

+2

Si noti che con il primo si può sempre usare un reference-wrapper per evitare una copia. –

+0

@Manoj R: volevo dire: hai una variabile oggetto funzione fn_obj, chiami apply (fn_obj), e poi hai accesso a fn_obj.state, che potrebbe essere stato modificato dalla chiamata da applicare – TommiT

risposta

7

Questo è già il caso di alcuni algoritmi; per esempio, in g++ 4.7.0:

//stl_algo.h 

template<typename _RandomAccessIterator, typename _UniformRandomNumberGenerator> 
void 
shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last, 
    _UniformRandomNumberGenerator&& __g) 
{ 
    ... 
} 

Ovviamente, è imperativo per cose come generatori di numeri casuali. Immagino che questo diventerà qualcosa di più comune nel tempo, comunque.

Problemi correlati