gpt4 book ai didi

c++ - 如何检测类中是否存在特定的成员变量?

转载 作者:太空宇宙 更新时间:2023-11-04 12:56:38 25 4
gpt4 key购买 nike

为了创建算法模板函数,我需要知道在作为模板参数的类中是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解决方案,因为它们很明显并且与问题无关。

最佳答案

另一种方式是这种方式,它也依赖SFINAE for expressions。如果名称查找导致歧义,编译器将拒绝该模板

template<typename T> struct HasX { 
struct Fallback { int x; }; // introduce member name "x"
struct Derived : T, Fallback { };

template<typename C, C> struct ChT;

template<typename C> static char (&f(ChT<int Fallback::*, &C::x>*))[1];
template<typename C> static char (&f(...))[2];

static bool const value = sizeof(f<Derived>(0)) == 2;
};

struct A { int x; };
struct B { int X; };

int main() {
std::cout << HasX<A>::value << std::endl; // 1
std::cout << HasX<B>::value << std::endl; // 0
}

它基于Usenet上某人的出色创意。

注意:HasX检查任意类型的任何称为x的数据或函数成员。引入成员名称的唯一目的是使成员名称查找可能不明确-成员的类型并不重要。

关于c++ - 如何检测类中是否存在特定的成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46257878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com