¿Se especializa la plantilla de C ++ basada en la presencia / ausencia de un miembro de la clase?

Considera lo siguiente:

<code>struct A {
  typedef int foo;
};

struct B {};

template<class T, bool has_foo = /* ??? */>
struct C {};
</code>

Quiero especializar C para que C <A> obtenga una especialización y C <B> obtenga la otra, según la presencia o ausencia del nombre tipográfico T :: foo. ¿Es esto posible usar rasgos de tipo o alguna otra magia de plantilla?

El problema es que todo lo que he intentado produce un error de compilación al crear una instancia de C <B> porque B :: foo no existe. ¡Pero eso es lo que quiero probar!

Edit: Creo que la respuesta de ildjarn es mejor, pero finalmente se me ocurrió la siguiente solución C ++ 11. El hombre es hacky, pero al menos es corto. :)

<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>

Respuestas a la pregunta(2)

Su respuesta a la pregunta