#include template concept CrtpDerived = requires { {&T::method} -> std::same_as; }; template class CrtpBase { public: CrtpBase() requires CrtpDerived = default; void crtp_method() { static_cast(this)->method(); } }; class Derived: public CrtpBase { public: void method() { } }; static_assert(CrtpDerived); void test() { Derived d; d.crtp_method(); }