c++ - 判断一个类是否有某个成员?

标签 c++ templates

<分区>

Possible Duplicate:
Possible for C++ template to check for a function’s existence?

我试图确定一个类型是否有某个成员。这是我试过的:

template <typename T,typename U=void>
class HasX
{
public:
    static const bool Result=false;
};

template <typename T>
class HasX<T,typename enable_if_c<(sizeof(&T::X)>0)>::type>
{
public:
    static const bool Result=true;
};


struct A
{
    int X();
};

struct B
{
    int Y();
};


int main()
{
    cout<<HasX<A>::Result<<endl; // 1
    cout<<HasX<B>::Result<<endl; // 0
}

它实际上可以在 GCC 上编译和工作,但是 VC 在实例化时给出了 error C2070: 'overloaded-function': illegal sizeof operand

是不是代码有问题,有没有其他方法可以做到这一点?

最佳答案

确实有:

typedef char (&no_tag)[1];
typedef char (&yes_tag)[2];

template < typename T, void (T::*)() > struct ptmf_helper {};
template< typename T > no_tag has_member_foo_helper(...);

template< typename T >
yes_tag has_member_foo_helper(ptmf_helper<T, &T::foo>* p);

template< typename T >
struct has_member_foo
{
    BOOST_STATIC_CONSTANT(bool
        , value = sizeof(has_member_foo_helper<T>(0)) == sizeof(yes_tag)
        );
};

struct my {};
struct her { void foo(); };

int main()
{
    BOOST_STATIC_ASSERT(!has_member_foo<my>::value);
    BOOST_STATIC_ASSERT(has_member_foo<her>::value);

    return 0;
} 

here复制粘贴.

编辑:更新符合 AFAIK 标准的代码。另请注意,您必须知道要检查的方法的返回类型的参数。

关于c++ - 判断一个类是否有某个成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3199892/

相关文章:

c++ - 如果派生类只包含自动变量成员,是否需要有虚析构函数?

c++ - 不完整的多线程 RayTracer 花费的时间是预期的两倍

c++ - 有没有办法避免在模板基类成员前面加上 `this` 前缀?

c++ - 在模板类中 boost 模板相关结构的多索引容器

c++ - 如何使用(类似?)可变参数模板在 C++14 中编写位掩码

c++ - 模板函数作为模板函数的参数 - 未解析的函数类型错误

c++ - 函数参数评估的完美转发和顺序

c++ - Eigen c++ 中的乘法矩阵给出了错误的维度

c++ - 同一类下两个对象的比较

c++ - 什么是对象切片?