为了创建算法模板函数,我需要知道类中的 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 C + + 中编译。在 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 C + + 中编译,有通用的解决方案吗?
UPD: 这里的结构 P1和 P2只是例子。可能有任何成员未知的类。
另外,请不要在这里发布 C + + 11解决方案,因为它们是显而易见的,与问题无关。