Wie kann festgestellt werden, ob eine bestimmte Membervariable in der Klasse vorhanden ist?

Um eine Algorithmusvorlagenfunktion zu erstellen, muss ich wissen, ob es sich bei x oder X (und y oder Y) in einer Klasse um ein Vorlagenargument handelt. Dies kann nützlich sein, wenn Sie meine Funktion für die MFC-CPoint-Klasse oder die GDI + PointF-Klasse oder für einige andere verwenden. Alle von ihnen verwenden unterschiedliche x in ihnen. Meine Lösung könnte auf den folgenden Code reduziert werden:

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

Es wird jedoch nicht in Visual Studio kompiliert, während es in GNU C ++ kompiliert wird. Mit Visual Studio könnte ich die folgende Vorlage verwenden:

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

Es lässt sich jedoch nicht in GNU C ++ kompilieren. Gibt es eine universelle Lösung?

UPD: Die Strukturen P1 und P2 sind hier nur Beispiele. Es kann Klassen mit unbekannten Mitgliedern geben.

P.S. Bitte posten Sie hier keine C ++ 11-Lösungen, da diese offensichtlich und für die Frage nicht relevant sind.

Antworten auf die Frage(10)

Ihre Antwort auf die Frage