2012-12-19 21 views
18

Olası Yinelenen:
Should templated functions take lambda arguments by value or by rvalue reference?Konveyörlere göre değer veya C++ 11 Evrensel Referans?

C++ standart kütüphane fonksiyonları çok gibi değeri functor (işlev işaretçisi veya işlev nesnesini) bağımsız değişken almak:

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

.. .Ama Universal Reference tarafından functor geçmek daha iyi olmaz mıydı? böylece gibi:

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

Eğer durumunu korumak fonksiyon nesneleri geçmesi ve daha yüksek dereceden işlevi döndürdü sonra (muhtemelen değiştirilmiş) durumuna erişimi olabilir Bu şekilde.

+0

Şablonlar derleme zamanında genişletilir/giderilir. Derleme zamanında devlet hakkında nasıl bilgi sahibi olabilirler? –

+2

Birincisi ile kopyadan kaçınmak için her zaman bir referans sarıcı kullanabilirsiniz. –

+0

@Manoj R: Demek istediğim: fn_obj işlev nesnesine sahipseniz, başvuruda bulunursunuz (fn_obj) ve daha sonra fn_obj.state öğesine erişebilirsiniz. – TommiT

cevap

7

Bu, bazı algoritmalarda zaten geçerlidir; örneğin, g++ 4.7.0 içinde: Açıkçası

//stl_algo.h 

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

, böyle rastgele sayı üreteçleri gibi şeyler için zorunludur. Bununla birlikte, bunun zaman içinde daha yaygın bir şey haline geleceğini hayal ediyorum.