これは全体としての概念ではなく、クラスにn
データメンバーがあるかどうかを判断するために使用するメソッドの1つです。これが完全なコードです。メンバー検出のための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
多分私は何かを見落としています。しかし、この1つのコードは、私が知らなかったことを示して教えてくれたので、これには何かがあるのかもしれません。私が期待するのは、そのオーバーロードが常に選択されることです(が付いているものではありません...
) 。これは、から継承するため、Derived
常に持つ必要があるためです。しかし、そうではありません。誰かが理由を説明できますか?X
Fallback