如何在不知道成员类型的情况下向 SFINAE 查询成员是否存在?

Meh*_*dad 5 c++ member sfinae

在 C++11 之前的代码中,如果我正在寻找一个我不知道类型的成员变量,我如何使用 SFINAE 来检查该成员是否存在?

jro*_*rok 4

以下是使用您要求的成员检测器习惯用法的示例:

template<typename T>
struct has_x {
    typedef char(&yes)[1];
    typedef char(&no)[2];

    // this creates an ambiguous &Derived::x if T has got member x

    struct Fallback { char x; };
    struct Derived : T, Fallback { };

    template<typename U, U>
    struct Check;

    template<typename U>
    static no test(Check<char Fallback::*, &U::x>*);

    template<typename U>
    static yes test(...);

    static const bool value = sizeof(test<Derived>(0)) == sizeof(yes);
};

#include <iostream>

struct A { private:  int x; };   // works with private, too
struct B { const char x; };
struct C { void x() volatile ; };
struct D : A { };
struct E {};
struct F : A, B {};  // note that &F::x is ambiguous, but
                     // the test with has_x will still succeed

int main()
{
    std::cout
        << has_x<A>::value                // 1
        << has_x<const B>::value          // 1
        << has_x<volatile C>::value       // 1
        << has_x<const volatile D>::value // 1
        << has_x<E>::value                // 0
        << has_x<F>::value;               // 1
}
Run Code Online (Sandbox Code Playgroud)

现场测试。

它也应该与 MSVC 一起使用。