成员检测码说明

Explanation on Member Detection code

本文关键字:说明 检测 成员      更新时间:2023-10-16

这不是整个概念,而是用于确定类是否具有n数据成员的方法之一。这里是完整的代码;SFINAE用于构件检测的常用方法。

template <typename T>
struct has_X {
    struct Fallback { int X; };
    struct Derived : T, Fallback {};
    template <typename U, U> struct S;
    template <typename C> static char (&f(S<int Fallback::*, &C::X> *))[1];
    template <typename C> static char (&f(...))[2];
    public:
        const static bool value = sizeof(f<Derived>(0)) == 2;
};

DerivedFallbackT继承的部分让我感到困惑,因为当我们做f的过载时,&C::X&Derived::X。但是,这个重载不应该总是被选择吗?因为Derived不是保证有X吗?因为它继承自具有该数据成员的Fallback

也许我忽略了什么。然而,这一段代码向我展示并教会了我以前不知道的东西,所以也许的一部分。我所期望的是总是选择过载(而不是与...),因为Derived应该始终具有X,因为它继承自Fallback。但事实并非如此。有人能解释一下为什么吗?

Fallback有一个名为X的数据成员,但是如果T也有一个名为X的成员,则Derived将有两个,在这种情况下,Derived::X不能明确地取。因此,如果T没有X,则使用第一个重载,如果TX,则使用第二个更通用的重载。这就是为什么您可以根据返回类型的大小来区分这些情况。