繁体   English   中英

成员检测代码说明

[英]Explanation on Member Detection code

它不是整个概念,而是用于确定类是否具有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 ,则使用第一个重载,如果T具有X ,则使用第二个更通用的版本。 这就是为什么你可以根据返回类型的大小来区分这些情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM