Для создания функции шаблона алгоритма мне нужно знать, являются ли x или X (и y или Y) в классе аргументом шаблона. Это может быть полезно при использовании моей функции для класса MFC CPoint или класса GDI + PointF или некоторых других. Все они используют в них разные x. Мое решение можно уменьшить до следующего кода:
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;
}
Но он не компилируется в Visual Studio при компиляции в GNU С++. С Visual Studio я мог бы использовать следующий шаблон:
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; }
Но он не компилируется в GNU С++. Существует ли универсальное решение?
UPD: Структуры P1 и P2 здесь только, например. Могут быть любые классы с неизвестными членами.
P.S. Пожалуйста, не отправляйте решения С++ 11 здесь, потому что они очевидны и не имеют отношения к вопросу.