7 #ifndef CPPWAMP_CONVERSION_ACCESS_HPP
8 #define CPPWAMP_CONVERSION_ACCESS_HPP
27 #define CPPWAMP_GENERATE_HAS_MEMBER(member) \
29 template <typename T> \
30 class CPPWAMP_API HasMember_##member \
33 using Yes = char[2]; \
36 struct Fallback { int member; }; \
37 struct Derived : T, Fallback { }; \
39 template <typename U> static No& test ( decltype(U::member)* ); \
40 template <typename U> static Yes& test ( U* ); \
43 static constexpr bool result = \
44 sizeof(test<Derived>(nullptr)) == sizeof(Yes); \
47 template < class T > \
48 struct has_member_##member \
49 : public std::integral_constant<bool, HasMember_##member<T>::result> \
65 template <
typename TConverter,
typename TObject>
66 static void convert(TConverter& c, TObject& obj)
69 has_member_convert<TObject>(),
70 "The 'convert' function has not been specialized for this type. "
71 "Either provide a 'convert' free function specialization, or "
72 "a 'convert' member function.");
76 template <
typename TConverter,
typename TObject>
77 static void convertFrom(TConverter& c, TObject& obj)
79 static_assert(has_member_convertFrom<TObject>(),
80 "The 'convertFrom' member function has not been provided "
85 template <
typename TConverter,
typename TObject>
86 static void convertTo(TConverter& c,
const TObject& obj)
88 static_assert(has_member_convertTo<TObject>(),
89 "The 'convertTo' member function has not been provided "
94 template <
typename TObject>
95 static TObject defaultConstruct() {
return TObject();}
97 template <
typename TObject>
98 static TObject* defaultHeapConstruct() {
return new TObject;}
101 CPPWAMP_GENERATE_HAS_MEMBER(
convert)
102 CPPWAMP_GENERATE_HAS_MEMBER(convertFrom)
103 CPPWAMP_GENERATE_HAS_MEMBER(convertTo)
108 #endif // CPPWAMP_CONVERSION_ACCESS_HPP