To be generic, you must define a function anyway under a different signature:
template<typename T> struct Derived : public T { auto m(std::false_type) { std::cout<<"Derived\n"; } };
Then you can use the methods given in this thread to check if the base class has the m() function:
template <typename...> using void_t = void; template <typename T, template <typename> class D, typename = void> struct detect : std::false_type {}; template <typename T, template <typename> class D> struct detect<T, D, void_t<D<T>>> : std::true_type {}; template <typename T> using has_m = decltype(std::declval<T>().m());
Finally, you can use this as
template<typename T> struct Derived : public T { auto m(std::true_type) { return T::m(); } auto m(std::false_type) { std::cout<<"Derived\n"; } auto m() { return m(detect< T, has_m>{}); } ^^^^^^^^^^
Demo
source share