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