2011-09-11 13 views
4

C++ 11では、不必要にオブジェクトをコピーすることを避けるためのセマンティクスが導入されており、そうでない場合はコピーが発生するときにそれらのセマンティクスを適用します。しかし、コピーが必要な場合もあれば、デフォルトではない場合もあります。欠落している単項std :: copyのベスト・インプリメンテーション

たとえば、reverseのこの単純な実装を考えてみましょう。範囲ベースのforは完璧な転送を使用するため、ループ内のコンテナを変更すると破損します。

auto out_iter = container.rbegin(); 
for (auto value : container) { 
    * out_iter ++ = value; 
} 

目標は...それは十分に簡単なようで、この使用

for (auto value : copy(container)) { 

を修正する任意の引数を受け入れ、基になる型を取得し、一時的なコピーを返すことです。

+0

EDSLラムダライブラリは通常、この関数' val'に名前を付けます)。 –

答えて

8

計算している戻り値の型は、typename std::decay<T>::typeとしてよく知られています。それ以外は、完璧な転送の完全な利点を享受するために、体内でstd::forwardを使用します。参照を転送し `ref`(とは対照的に、Boost.Phoenixよう

template<typename T> 
typename std::decay<T>::type 
val(T&& t) 
{ return std::forward<T>(t); } 
+2

非常に良い!完璧な転送は、値も変わらないので、val(move(x))とval(X())は実際にコピーを取ることはありません。これは、この機能を私とは異なる(そして優れている)ものにし、異なる名前にふさわしいものにします。 – Potatoswatter