#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で目的の機能を使用する方法はありますか?
のカテゴリがない、うんあなたが言及しているwは、定数参照がそこにあります。だから、私の最初の解決策はstd :: remove_referenceを使うことでしたが、それはGCCでコンパイルされているようですが、まだVisual Studio 2010ではコンパイルされていないようです。iterator_traitsのソリューションはうまくいきました。ありがとう! – ComplexRobot
また、私は後ろ向きの戻り型を必要としません。 – ComplexRobot