检查C ++中的成员是否存在

时间:2011-04-21 16:48:11

标签: c++ templates metaprogramming typetraits

  

可能重复:
  SFINAE to check for inherited member functions

我想执行编译时检查特定成员是否存在于类中。 我发现了一些像这样的解决方案: Is it possible to write a template to check for a function's existence?

但他们都有自己的缺点。有没有机会(平台独立地)检查成员是否存在,即使该成员是由基类继承的?

编辑:似乎我必须在类型安全之间进行选择而不检测从基类继承的成员(1)或没有类型安全但能够检测到成员(2)。这令我很沮丧:

struct base { int foo() { return 0; } };
struct derived : public base {};
struct other {};


template<class C>
struct has_foo
{ 
private:
    typedef char(&yes)[1];
    typedef char(&no )[2];

    struct pseudo { void foo(); };
    struct base : public C, public pseudo {};

    template<typename T, T> class check{}; 

#if SFINAE_VERSION == 1
    template<class U> static yes test(check<int (U::*)(), &U::foo>* = NULL);
    template<class>   static no  test(...);
#elif SFINAE_VERSION == 2
    template<class U> static no  test(U*, check<void (pseudo::*)(), &U::foo>* = 0); 
                      static yes test(...);
#endif
public:
#if SFINAE_VERSION == 1
    static bool const value = sizeof(test(static_cast<base*>(NULL))) == sizeof(yes);
#elif SFINAE_VERSION == 2
    static bool const value = sizeof(test<C>(NULL)) == sizeof(yes);
#endif
}; 


int main()
{
    std::cout << has_foo<base>::value << std::endl;     // true  (1) | true (2)
    std::cout << has_foo<derived>::value << std::endl;  // false (1) | true (2)
    std::cout << has_foo<other>::value << std::endl;    // false (1) | false(2)
}

EIDT2: “可能重复”中提供的解决方案并不能解决我的问题。我需要完全的类型安全和检测从基类继承的成员。

0 个答案:

没有答案