#pragma once #include namespace ComLight { namespace details { template constexpr bool pointersAssignable() { // See this for why `&` is required: https://stackoverflow.com/a/52429468/126995 return std::is_assignable::value; } } } // https://en.wikibooks.org/wiki/More_C++_Idioms/Member_Detector #define GENERATE_HAS_MEMBER(member) \ \ template < class T > \ class HasMember_##member \ { \ private: \ using Yes = char[2]; \ using No = char[1]; \ \ struct Fallback { int member; }; \ struct Derived : T, Fallback { }; \ \ template < class U > \ static No& test ( decltype(U::member)* ); \ template < typename U > \ static Yes& test ( U* ); \ \ public: \ static constexpr bool RESULT = sizeof(test(nullptr)) == sizeof(Yes); \ }; \ \ template < class T > \ struct has_member_##member \ : public std::integral_constant::RESULT> \ { \ };