9

这不是一个整体的概念,而是它用来确定一个类是否具有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;
};

Derived继承自两者Fallback的部分让T我感到困惑,因为当我们对 , 进行重载时f&C::X&Derived::X. 但是不应该总是选择这个重载,因为不能Derived保证有,X因为它继承自Fallback哪个数据成员?

也许我忽略了一些东西。然而,这段代码向我展示并教会了我从未知道的东西,所以也许这有一些东西。我期望的是始终选择该重载(而不是带有 的重载...),因为它Derived应该始终具有X,因为它继承自Fallback. 但这种情况并非如此。有人可以解释为什么吗?

4

1 回答 1

4

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

于 2012-12-27T22:09:36.473 回答