fork(1) download
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. template<class D>
  5. class widget
  6. {
  7. public:
  8. void foo() { self().bar(); }
  9.  
  10. private:
  11. D const& self() const
  12. {
  13. static_assert(std::is_base_of<widget, D>(), "D must derive");
  14. return (D const&)*this;
  15. }
  16.  
  17. D& self()
  18. {
  19. auto const& that = *this;
  20. return const_cast<D&>(that.self());
  21. }
  22. };
  23.  
  24. struct gadget : private widget<gadget>
  25. {
  26. using widget::foo;
  27. void bar() { std::cout << "gadget\n"; }
  28. };
  29.  
  30. int main()
  31. {
  32. gadget g;
  33. g.foo();
  34. }
  35.  
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
gadget