检查成员中是否包含某一个成员函数
- 利于C++模版的SFINAE特性,先创建一个辅助类SFINAE,此模版类有两个参数,需要检测的类和需要检测的类成员函数的类型
template<class T, void (T::*)(int)>
struct SFINAE
{
};
- 利于模版实现检查是否包含成员函数的通用模版
template<class T>
struct bool test(...)
{
return false;
}
- 利用模版的SFINAF特性实现特例化
// 若 T::func 存在,则SFINAE类可以被实例化,则此函数生效
template < class T >
static bool test( SFINAE< T, &T::func >* )
{
return true;
}
- 测试代码如下
// 检测成员函数是否存在
// 测试成员函数 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;
}
版权声明:本文为weixin_44687868原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。