Ich probiere Beispiele aus Walter Brown's TMP talk aus und ich versuche, seine has_member
Implementierung funktioniert zu bekommen.Was macht SFINAE nicht korrekt mit der folgenden Funktion has_member?
jedoch die Umsetzung wahr zu fälschlicherweise scheint zurückzukehren was dazu führt, mich gibt es einige Details von SFINAE zu glauben, dass ich verstehen mich nicht.
#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;
}
Ausgang ist:
Does FooWithType have type member? YES
Does FooNoType have type member? YES
Ich bin auf gcc 4.8.2 auf Ubuntu.
Sind Sie sicher, dass Ihre void_t-Implementierung in Ordnung ist? So erinnere ich mich nicht, dass es umgesetzt wurde. Vielleicht ist es sogar für schlecht geformte Vorlagen leer? – KABoissonneault
See [N3909] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2014/n3909.pdf), [N4436] (http://www.open-std.org /jtc1/sc22/wg21/docs/papers/2015/n4436.pdf) und [CWG 1558] (http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#1558) – dyp
Verwandte/Duplikat: [C++ 11: SFINAE in Template-Parameter, GCC vs Clang] (http://stackoverflow.com/q/28282398/) – dyp