Was funktioniert SFINAE mit der folgenden has_member-Funktion nicht richtig?
Ich probiere Beispiele aus Walter Browns TMP-Vortrag und ich versuche sein @ zu bekommhas_member
Implementierung funktioniert.
Die Implementierung scheint jedoch fälschlicherweise true zurückzugeben, was mich zu der Annahme veranlasst, dass es ein Detail von SFINAE gibt, das ich nicht verstehe.
#include <iostream>
#include <type_traits>
template <class ...>
using void_t = void;
template <class, class = void>
struct has_type_member: std::false_type {};
template <class T>
struct has_type_member<T, void_t<typename T::type> >: std::true_type {};
struct FooWithType
{
typedef int type;
};
struct FooNoType
{
};
int main()
{
std::cout << "Does FooWithType have type member? " <<
(has_type_member<FooWithType>() ? "YES" : "NO") << "\n";
std::cout << "Does FooNoType have type member? " <<
(has_type_member<FooNoType>() ? "YES" : "NO") << "\n";
return 1;
}
Ausgabe ist:
Does FooWithType have type member? YES
Does FooNoType have type member? YES
Ich bin auf gcc 4.8.2 unter Ubuntu.