#include <type_traits>
template < typename ...>
using void_type = void ;
template < typename , typename , typename = void_type<>>
struct CheckHelper: std:: false_type { } ;
template < typename T, typename Base>
struct CheckHelper< T, Base, void_type< typename std:: enable_if < std:: is_same < T, std:: nullptr_t > :: value , void > :: type >> : std:: true_type { } ;
template < typename T, typename Base, typename = void_type<>>
struct CheckFun: CheckHelper< T, Base> { } ;
template < typename T, typename Base>
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 { } ;
template < typename T = std:: nullptr_t >
class Base {
public :
virtual void fun( ) {
static_assert( CheckFun< T, Base> :: value , "Class T shoul override fun" ) ;
}
} ;
class Derived1: public Base< Derived1> {
public :
void fun( ) override {
}
} ;
class Derived2: public Base< Derived2> {
} ;
int main( ) {
Base<> b{ } ;
Derived1 d1{ } ;
Derived2 d2{ } ;
d2.fun ( ) ;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGU8dHlwZW5hbWUuLi4+CnVzaW5nIHZvaWRfdHlwZSA9IHZvaWQ7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZSA9IHZvaWRfdHlwZTw+PgpzdHJ1Y3QgQ2hlY2tIZWxwZXI6IHN0ZDo6ZmFsc2VfdHlwZSB7fTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBCYXNlPgpzdHJ1Y3QgQ2hlY2tIZWxwZXI8VCwgQmFzZSwgdm9pZF90eXBlPHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfc2FtZTxULCBzdGQ6Om51bGxwdHJfdD46OnZhbHVlLCB2b2lkPjo6dHlwZT4+IDogc3RkOjp0cnVlX3R5cGUge307Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQmFzZSwgdHlwZW5hbWUgPSB2b2lkX3R5cGU8Pj4Kc3RydWN0IENoZWNrRnVuOiBDaGVja0hlbHBlcjxULCBCYXNlPiB7fTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBCYXNlPgpzdHJ1Y3QgQ2hlY2tGdW48VCwgQmFzZSwgdm9pZF90eXBlPHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoJlQ6OmZ1biksIGRlY2x0eXBlKCZCYXNlOjpmdW4pPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlPj4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQgPSBzdGQ6Om51bGxwdHJfdD4KY2xhc3MgQmFzZSB7CnB1YmxpYzoKCXZpcnR1YWwgdm9pZCBmdW4oKSB7CgkJc3RhdGljX2Fzc2VydChDaGVja0Z1bjxULCBCYXNlPjo6dmFsdWUsICJDbGFzcyBUIHNob3VsIG92ZXJyaWRlIGZ1biIpOwoKCX0KfTsKCmNsYXNzIERlcml2ZWQxOiBwdWJsaWMgQmFzZTxEZXJpdmVkMT4gewpwdWJsaWM6Cgl2b2lkIGZ1bigpIG92ZXJyaWRlIHsKCgl9Cn07CgpjbGFzcyBEZXJpdmVkMjogcHVibGljIEJhc2U8RGVyaXZlZDI+IHsKfTsKCgppbnQgbWFpbigpIHsKCUJhc2U8PiBie307CglEZXJpdmVkMSBkMXt9OwoJRGVyaXZlZDIgZDJ7fTsKCWQyLmZ1bigpOwp9
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