Со времен С++11 есть возможность через SFINAE проверить наличие метода у типа. Но эта проверка громоздка и плохочитаема.
Вопрос появилось ли что либо новое с появлением новых стандартов, в том числе С++20? Или может кто знает, есть ли возможность прежние варианты упаковать в более лаконичный вид, используя вспомогательные классы которые запихнуть подальше в утилитные, оставив на виду только
HasMethod(T, myMethod, Res, Args...)::exists
Моя текущая версия проверки выглядит так, в отличие от упоминаемых в инете, она корректна для случаев если тестируемый класс является простым типом.
template<class T>
struct TestHasPack {
template <class U>
static void check_args( void(U::*)(Packer&) const );
template <class U>
static int detect(...);
template <class U> static typename
std::enable_if<
std::is_same<
decltype(check_args<U>(&U::pack)),void
>::value>::type
detect(T*);
static constexpr bool exists =
std::is_same<void,decltype(detect<T>((T*)nullptr))>::value;
};