Spezialisierung der C ++ - Vorlage auf der Grundlage der Anwesenheit / Abwesenheit eines Klassenmitglieds?
Folgendes berücksichtigen:
<code>struct A { typedef int foo; }; struct B {}; template<class T, bool has_foo = /* ??? */> struct C {}; </code>
Ich möchte C so spezialisieren, dass C <A> eine Spezialisierung erhält und C <B> die andere, basierend auf dem Vorhandensein oder Fehlen des Typnamens T :: foo. Ist dies mithilfe von Typmerkmalen oder einer anderen Schablonenmagie möglich?
Das Problem ist, dass alles, was ich versucht habe, einen Kompilierungsfehler erzeugt, wenn C <B> instanziiert wird, weil B :: foo nicht existiert. Aber genau das möchte ich testen!
Edit: Ich denke, die Antwort von ildjarn ist besser, aber ich habe endlich die folgende C ++ 11-Lösung gefunden. Mann ist es hacky, aber zumindest ist es kurz. :)
<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>