namespace internal { \
template<typename T, bool is_class = std::is_class<T>::value, typename = void> struct has_method_##NAME##_helper : std::false_type {}; \
\
template<
typename T>
struct has_method_##NAME##_helper<T, true,
std::void_t<decltype(&T::NAME)>> : has_method_##NAME##_helper<decltype(&T::NAME)> {}; \
\
template<typename Signature> struct has_method_##NAME##_helper<Signature, false> { \
static_assert(std::is_member_function_pointer<Signature>::value, "Not a member function pointer"); \
using T =
typename function_traits<Signature>::class_type; \
static_assert(!std::is_void<T>::value, "Void class type"); \
\
template<typename C, typename = std::void_t<decltype(static_cast<Signature>(&C::NAME))>> static auto check(int) -> std::true_type; \
template<typename> static auto check(...) -> std::false_type; \
\
using type = decltype(check<T>(0)); \
}; \
} \
template<typename Signature> struct has_method_##NAME : internal::has_method_##NAME##_helper<Signature>::type {};