fork download
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. #define IS_MEMBER(T1, M) \
  5. struct { \
  6. struct verystrangename1 { bool M; }; \
  7. template<typename T> struct verystrangename2 : verystrangename1, public T { }; \
  8. \
  9. enum return_t { not_member, is_object, is_function }; \
  10. template<typename T, typename = decltype(verystrangename2<T>::M)> constexpr return_t what_member() { return not_member; } \
  11. template<typename T> typename std::enable_if<std::is_member_object_pointer<decltype(&T::M)>::value, return_t>::type constexpr what_member() { return is_object; } \
  12. template<typename T> typename std::enable_if<std::is_member_function_pointer<decltype(&T::M)>::value, return_t>::type constexpr what_member() { return is_function; } \
  13. constexpr operator return_t() { return what_member<T1>(); } \
  14. }
  15.  
  16. struct t {
  17. int aaa;
  18. float bbb;
  19. void func() {}
  20. };
  21.  
  22. // Can't be in function
  23. IS_MEMBER(t, aaa) is_aaa_member_of_t;
  24. IS_MEMBER(t, ccc) is_ccc_member_of_t;
  25. IS_MEMBER(t, func) is_func_member_of_t;
  26.  
  27. // known at compile time
  28. enum { const_is_aaa_member_of_t = (int)is_aaa_member_of_t };
  29. static constexpr int const_is_func_member_of_t = is_func_member_of_t;
  30.  
  31.  
  32. int main() {
  33.  
  34. std::cout << std::boolalpha <<
  35. "0 - not_member, 1 - is_object, 2 - is_function \n\n" <<
  36. "is aaa member of t = " << is_aaa_member_of_t << std::endl <<
  37. "is ccc member of t = " << is_ccc_member_of_t << std::endl <<
  38. "is func member of t = " << is_func_member_of_t << std::endl <<
  39. std::endl;
  40.  
  41. return 0;
  42. }
Success #stdin #stdout 0s 3412KB
stdin
Standard input is empty
stdout
0 - not_member, 1 - is_object, 2 - is_function 

is aaa member of t = 1
is ccc member of t = 0
is func member of t = 2