00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00028 #ifndef OPM_HAS_MEMBER_GENERATOR_MACROS_HH
00029 #define OPM_HAS_MEMBER_GENERATOR_MACROS_HH
00030
00032 namespace Opm {
00033 template <class T>
00034 struct AlwaysVoid
00035 {
00036 typedef void type;
00037 };
00038 }
00040
00049 #define OPM_GENERATE_HAS_MEMBER(MEMBER_NAME, ...) \
00050 template <class T, class T2> \
00051 struct HasMember_##MEMBER_NAME##_Helper \
00052 { \
00053 static constexpr bool value = false; \
00054 }; \
00055 \
00056 template <class T> \
00057 struct HasMember_##MEMBER_NAME##_Helper<T, \
00058 typename Opm::AlwaysVoid<decltype(std::declval<T>().MEMBER_NAME(__VA_ARGS__))>::type> \
00059 { \
00060 static constexpr bool value = true; \
00061 }; \
00062 \
00063 template<typename T> \
00064 struct HasMember_##MEMBER_NAME \
00065 { \
00066 static constexpr bool value = HasMember_##MEMBER_NAME##_Helper<T, void>::value; \
00067 };
00068
00069 #endif