检查成员中是否包含某一个成员函数
- 利于C++模版的SFINAE特性,先创建一个辅助类SFINAE,此模版类有两个参数,需要检测的类和需要检测的类成员函数的类型
template<class T, void (T::*)(int)>
struct SFINAE
{
};
- 利于模版实现检查是否包含成员函数的通用模版
template<class T>
struct bool test(...)
{
return false;
}
- 利用模版的SFINAF特性实现特例化
template < class T >
static bool test( SFINAE< T, &T::func >* )
{
return true;
}
- 测试代码如下
#include <stdio.h>
class A{
public:
void func(int);
};
class B{
};
class C{
private:
void func(int);
};
class D:public A{};
class E{
public:
virtual void func(int){}
};
class F:public E{};
struct Helper
{
template < class T, void ( T::*)(int) >
struct SFINAE
{
};
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));
printf("B have func:%d\n",Helper::test<B>(0));
printf("C have func:%d\n",Helper::test<C>(0));
printf("D have func:%d\n",Helper::test<D>(0));
printf("E have func:%d\n",Helper::test<E>(0));
printf("F have func:%d\n",Helper::test<F>(0));
return 0;
}