fork download
  1. #include <type_traits>
  2.  
  3. template<typename...>
  4. using void_type = void;
  5.  
  6. template <typename, typename, typename = void_type<>>
  7. struct CheckHelper: std::false_type {};
  8.  
  9. template <typename T, typename Base>
  10. struct CheckHelper<T, Base, void_type<typename std::enable_if<std::is_same<T, std::nullptr_t>::value, void>::type>> : std::true_type {};
  11.  
  12. template <typename T, typename Base, typename = void_type<>>
  13. struct CheckFun: CheckHelper<T, Base> {};
  14.  
  15. template <typename T, typename Base>
  16. struct CheckFun<T, Base, void_type<typename std::enable_if<!std::is_same<decltype(&T::fun), decltype(&Base::fun)>::value, void>::type>> : std::true_type {};
  17.  
  18. template<typename T = std::nullptr_t>
  19. class Base {
  20. public:
  21. virtual void fun() {
  22. static_assert(CheckFun<T, Base>::value, "Class T shoul override fun");
  23.  
  24. }
  25. };
  26.  
  27. class Derived1: public Base<Derived1> {
  28. public:
  29. void fun() override {
  30.  
  31. }
  32. };
  33.  
  34. class Derived2: public Base<Derived2> {
  35. };
  36.  
  37.  
  38. int main() {
  39. Base<> b{};
  40. Derived1 d1{};
  41. Derived2 d2{};
  42. d2.fun();
  43. }
Compilation error #stdin compilation error #stdout 0s 4388KB
stdin
Standard input is empty
compilation info
prog.cpp:22:3: error: static_assert failed "Class T shoul override fun"
                static_assert(CheckFun<T, Base>::value, "Class T shoul override fun");
                ^             ~~~~~~~~~~~~~~~~~~~~~~~~
prog.cpp:42:5: note: in instantiation of member function 'Base<Derived2>::fun' requested here
        d2.fun();
           ^
1 error generated.
stdout
Standard output is empty