2011-12-28 12 views
0

以下はvs 2010マップの実装から抜粋したものです。このメンバー関数はファイルxtreeにある親クラス_Treeで定義されています。戻り値の型テンプレート(enable_if)は何を禁止しますか?

template<class _Valty> 
    typename _STD tr1::enable_if<!_STD tr1::is_same<const_iterator, 
     typename _STD tr1::remove_reference<_Valty>::type>::value, 
      iterator>::type 
    insert(const_iterator _Where, 
     _Valty&& _Val) 
    { // try to insert node with value _Val using _Where as a hint 
    return (_Insert(_Where, 
     this->_Buynode(_STD forward<_Valty>(_Val)))); 
    } 

実は、この関数はiterator insert (iterator position, const value_type& x)で、それの興味深い部分は、その戻り値の型です!どういう意味ですか?私が理解するところでは、value_type(つまり、_Valty)がconst_iteratorと同じ場合、テンプレートのインスタンス化が無効になります。

しかし、const_iteratorのへVALUE_TYPEからの暗黙の変換が存在しないので、このような場合には、これは冗長なように見えます。

私は理解できないものがあると信じています。それは何ですか?戻り値の型テンプレートは何を禁止しますか?

答えて

2

オブジェクトの範囲[イテレータ、イテレータ]を取る他のinsertメンバがあります。

enable_ifは、関連する種類が異なる場合にのみこの機能を有効にすることで、過負荷解決の問題を回避するために使用されます。

関連する問題