2012-12-19 16 views
18

Powiel możliwe:
Should templated functions take lambda arguments by value or by rvalue reference?Przekazywanie funktorów według wartości lub według uniwersalnego odwołania C++ 11?

C++ standardowe funkcje biblioteczne wziąć funktor (wskaźnik funkcji lub obiekt funkcyjny) argumentów przez wartość, tak jak poniżej:

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

.. Ale czy nie byłoby lepiej przekazać funktory przez Universal Reference? Tak:

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

ten sposób można przekazać obiekty funkcyjne, które utrzymują stan i mieć dostęp do tego (ewentualnie zmodyfikowanego) Stan po funkcja wyższego rzędu powrócił.

+0

Szablony są rozwijane/rozwiązywane podczas kompilacji. Skąd mogą wiedzieć o stanie w czasie kompilacji? –

+2

Należy pamiętać, że przy pierwszym użyciu zawsze można użyć opakowania referencyjnego, aby uniknąć kopiowania. –

+0

@Manoj R: Miałem na myśli: Masz zmienną obiektu funkcji fn_obj, wywołujesz funkcję fn_obj, a następnie masz dostęp do pliku fn_obj.state, który mógł zostać zmodyfikowany przez wywołanie do zastosowania – TommiT

Odpowiedz

7

Tak jest już w przypadku niektórych algorytmów; na przykład w g++ 4.7.0:

//stl_algo.h 

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

Oczywiście, jest to konieczne do rzeczy, takich jak generatorów liczb losowych. Wyobrażam sobie, że stanie się to jednak bardziej powszechne w czasie.

Powiązane problemy