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

Respuestas a la pregunta(10)

Su respuesta a la pregunta