Especializando modelo C ++ com base na presença / absente de um membro da classe?

Considere o seguinte:

struct A {
  typedef int foo;
};

struct B {};

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

Eu quero especializar C para que C <A> receba uma especialização e C <B> obtenha a outra, com base na presença ou ausência do typename T :: foo. Isso é possível usando traços de tipo ou algum outro modelo mágico?

O problema é que tudo que eu tentei produz um erro de compilação ao instanciar o C <B> porque o B :: foo não existe. Mas é isso que eu quero testar!

Edit: Eu acho que a resposta de ildjarn é melhor, mas eu finalmente encontrei a seguinte solução C ++ 11. Cara é hacky, mas pelo menos é curto. :)

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