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