\
template <typename C, typename F> struct is_##method##_callable {}; \
template <typename C, typename Ret, typename... Args> \
struct is_##method##_callable<C, Ret(Args...)> { \
template <typename T> static constexpr bool is(...) { return false; } \
template <typename T> \
static constexpr bool is( \
typename std::is_same< \
Ret, decltype(std::declval<T>().method(std::declval<Args...>()))>::type *) { \
return true; \
} \
static constexpr bool value = is<C>(nullptr); \
}; \
\
template <typename C, typename F> struct has_##method##_signature {}; \
template <typename C, typename Ret, typename... Args> \
struct has_##method##_signature<C, Ret(Args...)> { \
using SIG = Ret (C::*)(Args...); \
template <typename T, T> struct same; \
template <typename T> \
static constexpr auto has(same<SIG, &T::method> *) -> typename std::true_type::type; \
template <typename T> \
static constexpr auto has(...) -> typename std::false_type::type; \
static constexpr bool value = decltype(has<C>(0))::value; \
}