2011-01-27 5 views
2

STDの変形のために、次のコードがある::スワップ():std :: swap()の理解。 tr1 :: _ Remove_referenceの目的は何ですか? VS10のSTLの実装では

// TEMPLATE FUNCTION _Move 
template<class _Ty> inline 
    typename tr1::_Remove_reference<_Ty>::_Type&& 
     _Move(_Ty&& _Arg) 
    { // forward _Arg as movable 
    return ((typename tr1::_Remove_reference<_Ty>::_Type&&)_Arg); 
    } 

    // TEMPLATE FUNCTION swap (from <algorithm>) 
template<class _Ty> inline 
    void swap(_Ty& _Left, _Ty& _Right) 
    { // exchange values stored at _Left and _Right 
    _Ty _Tmp = _Move(_Left); 
    _Left = _Move(_Right); 
    _Right = _Move(_Tmp); 
    } 

キャスト_moveで(typename tr1::_Remove_reference<_Ty>::_Type&&)(のは)私の質問の源です。 _Remove_referenceは何をするん

 // TEMPLATE _Remove_reference 
template<class _Ty> 
    struct _Remove_reference 
    { // remove reference 
    typedef _Ty _Type; 
    }; 

、そしてなぜこの文脈_Remove_reference

は、次のように定義されて? さらに、& &は何をしていますか?

答えて

3

_Remove_referenceは、よくその型から参照を削除するテンプレートです。私はテンプレートがT&T&&に同じで、typedefと同じように特化されていると確信しています。

ここにどれくらい詳しく説明する必要があるかわかりません。テンプレートのメタプログラミングに精通していますか?

_Moveはちょうどstd::moveと同じように見えます。その引数はrvalueにキャストされます。練習のポイントは、std::swapがコピーの代わりに動きをすることができるということです。 move semanticsに精通していますか?

& &ここではどのようにすればいいですか?

あなたが探している用語は "rvalue reference"です。 this videoを見て、質問が出てきます。

+0

非常に素晴らしいありがとう。私はそれを愛する。私は移動のセマンティクスについて読む、コピーおよびスワップイディオム、および右辺値参照。すべてを例外的な安全性とコードの削減を除けば、パフォーマンス上のメリットがありますか? –

+0

あなたの最初の2つの質問に。はい、あなたは正しいです、そして、私はテンプレートメタプログラミングに精通しています。 –

+0

@マイケル:あなたが何を求めているのか分かりません。移動よりも移動が速いのかどうか聞いていますか?それはタイプによって異なります。タイプに外部リソースがある場合は、移動はコピーよりもはるかに高速です。本質的にすべての動的STLコンテナを考えてください。例えば、 'std :: array 'のように、型が "フラット"の場合、移動には性能上のメリットはありません。なぜなら、ポインタのつまずきによって移動できるリソースがないからです。それはあなたの質問に答えますか? – fredoverflow

1

これはC++ 0xの値の一部です。どのようなテンプレートmoveを行うことはタイプがを移動をサポートしている場合(何もコピーが行われていないswap移動セマンティクスで実現することができるように右辺値参照への参照を変換している。

_Remove_referenceあり、テンプレートのように見えますタイプからの参照を持っていないタイプを抽出するために、それはそれを持っているかもしれない。の

template <typename T> struct remove_ref { typedef T type; }; 
template <typename T> struct remove_ref<T&> { typedef T type; }; 
関連する問題