\
private: \
\
template <typename Z> static constexpr auto name##Check(char) -> decltype( \
static_cast<retval (Z::*)(input)> (&Z::name), \
bool() \
) { return true; } \
template <typename Z> static constexpr auto name##Check(int) -> decltype( \
static_cast<retval (Z::*)(input) const> (&Z::name), \
bool() \
) { return true; } \
template <typename Z> static constexpr auto name##Check(long) -> decltype( \
&Z::name, \
bool()) \
{ \
static_assert(Impl::is_compatible_f< \
decltype(&Z::name), \
retval(input) \
>::value,
"You provide a member '" STR(name)
"' but with the wrong signature."); \
return true; \
} \
template <typename Z> static constexpr auto name##Check(...) -> bool { return false; } \
\
public: \
enum { \
name = name##Check<M>('\0') \
};