C++0x检查成员函数是否存在

检查成员中是否包含某一个成员函数

  1. 利于C++模版的SFINAE特性,先创建一个辅助类SFINAE,此模版类有两个参数,需要检测的类和需要检测的类成员函数的类型
template<class T, void (T::*)(int)>
struct SFINAE
{
};
  1. 利于模版实现检查是否包含成员函数的通用模版
template<class T>
struct bool test(...)
{
	return false;
}
  1. 利用模版的SFINAF特性实现特例化
    // 若 T::func 存在,则SFINAE类可以被实例化,则此函数生效
    template < class T >
    static bool test( SFINAE< T, &T::func >* )
    {
        return true;
    }
  1. 测试代码如下
// 检测成员函数是否存在
// 测试成员函数 func

#include <stdio.h>
// 实现的public func 
class A{
public:
    void func(int);
};

// 未实现func
class B{
};

// 实现的private func
class C{
private:
    void func(int);
};

// 继承的A
class D:public A{};

// 实现的virtual func
class E{
public:
    virtual void func(int){}
};

// 继承virtual的func
class F:public E{};

struct Helper
{
    // 辅助类
    template < class T, void ( T::*)(int) >
    struct SFINAE
    {
    };

    // 若 T::func 存在,则被特例化
    template < class T >
    static bool test( SFINAE< T, &T::func >* )
    {
        return true;
    }

    template < class T >
    static bool test( ... )
    {
        return false;
    }
};

int main()
{
    printf("A have func:%d\n",Helper::test<A>(0)); // true 有public的func
    printf("B have func:%d\n",Helper::test<B>(0)); // false 未实现func
    printf("C have func:%d\n",Helper::test<C>(0)); // false 私有的func
    printf("D have func:%d\n",Helper::test<D>(0)); // false 通过继承未自己实现的func
    printf("E have func:%d\n",Helper::test<E>(0)); // true  有public的virtual func
    printf("F have func:%d\n",Helper::test<F>(0)); // false 继承virtual但未自己实现的func
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值