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>

questionAnswers(2)

yourAnswerToTheQuestion