#include <iostream>
#include <type_traits>
#include <memory>
#include <vector>
#include <fstream>
#include <memory.h>
#define HAS_MEMBER_FUNCTION(member)\
template<typename T, typename... Args>struct has_member_##member\
{\
private:\
template<typename U> static auto Check(int) -> decltype(std::declval<U>().member(std::declval<Args>()...), std::true_type());\
template<typename U> static std::false_type Check(...);\
public:\
enum{value = std::is_same<decltype(Check<T>(0)), std::true_type>::value};\
};
#define HAS_MEMBER_DATA(member)\
template<typename T>struct has_member_##member\
{\
template <typename _T>static auto check(_T)->typename std::decay<decltype(_T::member)>::type;\
static void check(...);\
using type = decltype(check(std::declval<T>()));\
enum { value = !std::is_void<type>::value };\
};
例如要检查变量x, y, z, intensity, 则定义如下:
HAS_MEMBER_DATA(x);
HAS_MEMBER_DATA(y);
HAS_MEMBER_DATA(z);
HAS_MEMBER_DATA(intensity);
对于数据类型T, 需要进行判断时:
if(has_member_x<T>::value)
{
// Type T has member data x
}
else
{
// Type T hasn't member data x
}
如果返回值不等于0,那么表示包含该成员