今日、クラスにネストされた型があるかどうかについて、型の切り替えを実行しようとしていましたreverse_iterator
。これらの fora で、次のような実用的なソリューションを見つけました。
template<typename T>
struct is_reverse_iterable
{
using yes = uint8_t;
using no = uint16_t;
template<typename U>
static yes& test(typename U::reverse_iterator*);
template<typename>
static no& test(...);
static constexpr bool value = sizeof(test<T>(0)) == sizeof(yes);
};
このクラスは、メインから条件をチェックするだけで問題なく動作しますが、その小さな関数も書いているため、問題が発生します。
template<typename T>
void foo(T&& iter)
{
std::cout << typeid(T).name() << std::endl;
std::cout << is_reverse_iterable<T>::value << std::endl;
}
これが私にいくつかの問題を引き起こす主なものです:
int main()
{
using namespace std;
vector<int> v;
cout << typeid(decltype(v)).name() << endl;
cout << is_reverse_iterable<decltype(v)>::value << endl;
foo(v);
return 0;
}
std::vector<int>
ネストされた型 name が含まれているため、どこに置いても true が返さreverse_iterator
れると思うでしょう。少なくとも、私はそう思います。is_reverse_iterable<vector<int>>::value
しかし、そうではありません。上記のメインの結果は次のとおりです。
St6vectorIiSaIiEE
1
St6vectorIiSaIiEE
0
メインから呼び出された場合、構造体is_reverse_iterable
は の名前reverse_iterator
を認識しましたvector<int>
が、 から呼び出された場合は認識しませんでしたfoo
。実際、私には理由がわかりません。誰かに問題が何であるかを説明してもらいたいです:)
PS : MinGW g++ 4.7.1 を使用してコンパイルし、オプション -std=c++11 を指定します。