我以为我得到了这个课程的想法(从这里https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Member_Detector):
templateclass DetectX { struct Fallback { int X; }; // add member name "X" struct Derived : T, Fallback { }; template struct Check; typedef char ArrayOfOne[1]; // typedef for an array of size one. typedef char ArrayOfTwo[2]; // typedef for an array of size two. template static ArrayOfOne & func(Check *); template static ArrayOfTwo & func(...); public: typedef DetectX type; enum { value = sizeof(func (0)) == 2 }; };
但是我试着让它适应我正在寻找会员的情况double MyTest
.所以我改变了这一行:
struct Fallback { int X; }; // add member name "X"
至
struct Fallback { double MyTest; };
但无论是否有MyTest成员,探测器都会为所有级别返回"true".我把线改为:
struct Fallback { int MyTest; };
然后它按预期工作.
任何人都可以解释为什么后备必须是一个int而不是你实际上正在寻找的成员的类型?
这是一个例子,我将X视为int,而Y视为double:
#include#include // https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Member_Detector // Standard point representation struct Point3 { double X,Y,Z; }; struct SomethingElse{}; template class DetectX { struct Fallback { int X; }; // add member named "X" struct Derived : T, Fallback { }; template struct Check; typedef char ArrayOfOne[1]; // typedef for an array of size one. typedef char ArrayOfTwo[2]; // typedef for an array of size two. template static ArrayOfOne & func(Check *); template static ArrayOfTwo & func(...); public: typedef DetectX type; enum { value = sizeof(func (0)) == 2 }; }; template class DetectY { struct Fallback { double Y; }; // add member named "Y" struct Derived : T, Fallback { }; template struct Check; typedef char ArrayOfOne[1]; // typedef for an array of size one. typedef char ArrayOfTwo[2]; // typedef for an array of size two. template static ArrayOfOne & func(Check *); template static ArrayOfTwo & func(...); public: typedef DetectY type; enum { value = sizeof(func (0)) == 2 }; }; int main() { std::cout << DetectX ::value << " " << DetectX ::value << std::endl; std::cout << DetectY ::value << " " << DetectY ::value << std::endl; return 0; }
我的输出是:
1 0
1 1