Specjalizuję szablon C ++ oparty na obecności / nieobecności członka klasy?
Rozważ następujące:
<code>struct A { typedef int foo; }; struct B {}; template<class T, bool has_foo = /* ??? */> struct C {}; </code>
Chcę specjalizować C, aby C <A> pobierało jedną specjalizację, a C <B> drugą, na podstawie obecności lub braku nazwy typu T :: foo. Czy jest to możliwe dzięki cechom typu lub innej magii szablonu?
Problem polega na tym, że wszystko, czego próbowałem, powoduje błąd kompilacji podczas tworzenia instancji C <B>, ponieważ B :: foo nie istnieje. Ale to właśnie chcę przetestować!
Edytuj: Myślę, że odpowiedź ildjarn jest lepsza, ale w końcu wymyśliłem następujące rozwiązanie C ++ 11. Człowiek to hacky, ale przynajmniej jest krótki. :)
<code>template<class T> constexpr typename T::foo* has_foo(T*) { return (typename T::foo*) 1; } constexpr bool has_foo(...) { return false; } template<class T, bool has_foo = (bool) has_foo((T*)0)> </code>