Especializando modelo C ++ com base na presença / absente de um membro da classe?
Considere o seguinte:
<code>struct A { typedef int foo; }; struct B {}; template<class T, bool has_foo = /* ??? */> struct C {}; </code>
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. :)
<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>