9

これは全体としての概念ではなく、クラスに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、両方から継承しFallbackT混乱する部分があります。しかし、このオーバーロードは、そのデータメンバーの継承元であるため、保証されていないため、常に選択する必要がありますか?f&C::X&Derived::XDerivedXFallback

多分私は何かを見落としています。しかし、この1つのコードは、私が知らなかったことを示して教えてくれたので、これに何かがあるのか​​もしれません。私が期待するのは、そのオーバーロードが常に選択されることです(が付いているものではありません...) 。これは、から継承するため、Derived常に持つ必要があるためです。しかし、そうではありません。誰かが理由を説明できますか?XFallback

4

1 に答える 1

4

Fallbackにという名前のデータメンバーが1つありますが、という名前のメンバーもある場合X、Derivedには2つあります。この場合、明確に解釈することはできません。したがって、がない場合は最初のオーバーロードが使用され、ある場合は2番目のより一般的なバージョンが使用されます。これが、リターンタイプのサイズに応じてこれらのケースを区別できる理由です。TXDerived::XTXTX

于 2012-12-27T22:09:36.473 に答える