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>

Antworten auf die Frage(2)

Ihre Antwort auf die Frage