Comment détecter si il y a une variable membre de la classe?

Pour la création de l'algorithme fonction de modèle j'ai besoin de savoir si x ou X (et y ou Y) dans la classe qui est argument de modèle. Il peut, par utile lors de l'utilisation de ma fonction pour MFC CPoint de la classe ou de l'interface GDI+ PointF de la classe ou de certains autres. Tous utilisent différentes x en eux. Ma solution pourrait être réduit au code suivant:


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;
}

Mais il ne compile pas dans Visual Studio, lors de la compilation en C++ de GNU. Avec Visual Studio, j'ai pu utiliser le modèle suivant:


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; }

Mais il n'est pas compilé en C++ de GNU. Est-il solution universelle?

UPD: Structures P1 et P2 sont ici pour exemple. Il y a peut être l'une des classes avec les membres inconnus.

P. S. s'il vous Plaît, ne postez pas de C++11 solutions ici parce qu'ils sont évidents et ne sont pas pertinentes à la question.

  • Je ne crois pas que la deuxième façon est la norme (intégrale des expressions constantes ne peuvent pas utiliser l'op== avec des opérandes impliquant des op&). Mais la première ressemble à droite. Ce n'msvc++ dire à ce sujet?
  • Regardez le lien à la fin de ma réponse - je pense que explique le problème (à la fois pourquoi les compilateurs de la refuser, et si c'est vraiment autorisé par le C++98 Standard).
  • +1: défi Intéressant 🙂
  • J'ai écrit une explication approfondie du code correct pour résoudre ce problème, et il est disponible ici: cpptalk.wordpress.com/2009/09/12/... . Désolé de faire cette remarque à deux reprises, mais je pense qu'il appartient, en vertu de la poste principal.
  • double possible de Est-il possible d'écrire en C++ modèle pour vérifier la fonction de l'existence?