fork download
  1. #include <iostream>
  2.  
  3. template< typename DT, typename... Bases > // C++11 variadic template
  4. struct CRTP: private Bases...
  5. {
  6. friend DT; // C++11 extended friend
  7. DT func( void ) { return DT(); }
  8. };
  9.  
  10. struct A :
  11. public CRTP< A >
  12. {
  13. int get() { return value; }
  14. private:
  15. int value = 4;
  16. };
  17.  
  18. struct B :
  19. public CRTP< B, A >
  20. {
  21. double get() { return value; }
  22. private:
  23. double value = 1.1;
  24. };
  25.  
  26. int main()
  27. {
  28. A a;
  29. B b;
  30. std::cout << " a: " << a.get() << " b: " << b.get() << std::endl;
  31. A aa = a.func();
  32. std::cout << " aa: " << aa.get() << std::endl;
  33. B bb = b.func();
  34. std::cout << " bb: " << bb.get() << std::endl;
  35. }
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
 a: 4 b: 1.1
 aa: 4
 bb: 1.1