C++:对象判断是否含有某个成员函数

/ C++ / 没有评论 / 2070浏览

sizeof在编译期执行,结果是函数返回类型的大小,函数并不会被调用。sizeof获取返回值的函数可以不定义。

#include <iostream>

template<typename T>
struct has_no_destroy {
	template<typename C>
	static char test(decltype(&C::no_destroy));


	template<typename C>
	static int32_t test(...);

	const static bool value = sizeof(test<T>(0)) == 1;
};
// 其作用就是用来判断是否有 no_destroy 函数

struct A {

};

struct B {
	void no_destroy() {}
};
struct C {
	int no_destroy;
};

struct D : B {

};

int main()
{
	printf("%d\n", has_no_destroy<A>::value);
	printf("%d\n", has_no_destroy<B>::value);
	printf("%d\n", has_no_destroy<C>::value);
	printf("%d\n", has_no_destroy<D>::value);
	system("PAUSE");
	return 0;
}