¿Cómo detectar si hay una variable miembro específica en la clase?
Para crear una función de plantilla de algoritmo, necesito saber si x o X (y y o Y) en la clase que es el argumento de la plantilla. Puede ser útil cuando use mi función para la clase MFC CPoint o la clase GDI + PointF o algunas otras. Todos ellos usan diferentes x en ellos. Mi solución podría reducirse al siguiente código:
<code> template<int> struct TT {typedef int type;}; template<class P> bool Check_x(P p, typename TT<sizeof(&P::x)>::type b = 0) { return true; } template<class P> bool Check_x(P p, typename TT<sizeof(&P::X)>::type b = 0) { return false; } struct P1 {int x; }; struct P2 {float X; }; // it also could be struct P3 {unknown_type X; }; int main() { P1 p1 = {1}; P2 p2 = {1}; Check_x(p1); // must return true Check_x(p2); // must return false return 0; } </code>
Pero no compila en Visual Studio, mientras compila en GNU C ++. Con Visual Studio podría usar la siguiente plantilla:
<code> template<class P> bool Check_x(P p, typename TT<&P::x==&P::x>::type b = 0) { return true; } template<class P> bool Check_x(P p, typename TT<&P::X==&P::X>::type b = 0) { return false; } </code>
Pero no se compila en GNU C ++. ¿Hay solución universal?
UPD: Las estructuras P1 y P2 aquí son solo por ejemplo. Puede haber clases con miembros desconocidos.
PD Por favor, no publique las soluciones de C ++ 11 aquí porque son obvias y no son relevantes para la pregunta.