2012-04-10 14 views
1
SFINAE原理は、Visual Studioで本当に簡単思える何のために働いていない
#include <type_traits> 
#include <iostream> 

struct MyStruct 
{ 
    int value; 
    MyStruct(int value = 42) : value(value) { } 
    const int& getInt() const { return value; } 
}; 

template <typename ITER_TYPE> 
auto getIteratorInt(ITER_TYPE iter) -> 
    typename std::enable_if 
    <std::is_pointer<decltype(*iter)>::value, const int&>::type 
{ 
    return (*iter)->getInt(); 
} 

template <typename ITER_TYPE> 
auto getIteratorInt(ITER_TYPE iter) -> 
    typename std::enable_if 
    <!std::is_pointer<decltype(*iter)>::value, const int&>::type 
{ 
    return iter->getInt(); 
} 

int main(void) 
{ 
    MyStruct gloryInt; 
    MyStruct* gloryIntPtr = &gloryInt; 
    std::cout << getIteratorInt(gloryIntPtr) << std::endl; 
    std::cout << getIteratorInt(&gloryIntPtr) << std::endl; 
    return 0; 
} 

私の意図は、正しいテンプレートをコンパイルするstd::enable_ifを使用することですSFINAEの原則に基づく過負荷。 (既存の戻り型のない関数は無視され、もう一方はコンパイルされます)。このようにして、オブジェクトへのポインタまたはダブルポインタを使用することができ、直接オブジェクトはアクセスされるオブジェクトになります。SFINAEはSTDのためのVisual Studio 2010上で動作していない:: is_pointer

私は、次のコンパイルエラーが表示されます。

main.cpp(14): error C2039: 'type' : is not a member of 'std::tr1::enable_if<_Test,_Type>' 
      with 
      [ 
       _Test=false, 
       _Type=const int & 
      ] 
main.cpp(17): error C3646: 'type' : unknown override specifier 

まあ、これはSFINAEが採用されなかった場合は持っている本当に明白エラーです。 Visual Studio 2010で目的の機能を使用する方法はありますか?

答えて

2

他の回答を更新する前に、あなたのプロフィールページを確認しておく必要があります。

タイプdecltype(* iter)は、int const *const &を指します。これは、「裸の」ポインタではなく、ポインタへの参照です。したがって、std::is_pointerは予期しない結果を返します。これを解決する方法は2つあります。

  • 使用std::iterator_traits私が好むC++ 03、から:

    typename std::iterator_traits<ITER_TYPE>::value_type 
    
  • 値を反映するために追加される場合がありますdecltypeの参照を取り除きstd::decayメタ関数を使用します表現

    typename std::decay< decltype(* iter) >::type 
    
+0

のカテゴリがない、うんあなたが言及しているwは、定数参照がそこにあります。だから、私の最初の解決策はstd :: remove_referenceを使うことでしたが、それはGCCでコンパイルされているようですが、まだVisual Studio 2010ではコンパイルされていないようです。iterator_traitsのソリューションはうまくいきました。ありがとう! – ComplexRobot

+0

また、私は後ろ向きの戻り型を必要としません。 – ComplexRobot

関連する問題