当前位置:  开发笔记 > 编程语言 > 正文

为什么Member Detector后备必须是int?

如何解决《为什么MemberDetector后备必须是int?》经验,为你挑选了0个好方法。

我以为我得到了这个课程的想法(从这里https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Member_Detector):

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

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有