fork download
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. template <typename T>
  6. class Base
  7. {
  8. public:
  9. T* t;
  10. void b() {}
  11. };
  12.  
  13. class D1:
  14. public Base<D1>
  15. {
  16. public:
  17. int d1;
  18. };
  19.  
  20. class D2:
  21. public D1
  22. {
  23. public:
  24. int d2;
  25. };
  26.  
  27. template<template<typename> class Base, typename T>
  28. struct IsAnyPublicBaseOf
  29. {
  30. typedef char (&yes)[2];
  31.  
  32. template<typename X>
  33. static yes Check (Base<X>*);
  34. static char Check (...);
  35.  
  36. static const bool value = (sizeof(Check((T*)0)) == sizeof(yes));
  37. };
  38.  
  39. template<bool> struct Bool;
  40. template <typename T, typename = Bool<true> >
  41. class Selector
  42. {
  43. public:
  44. template <typename U>
  45. void a(U& u)
  46. {
  47. cout << "a(U&)" << endl;
  48. }
  49. };
  50.  
  51. template<typename T>
  52. class Selector<T,Bool<IsAnyPublicBaseOf<Base,T>::value> >
  53. {
  54. public:
  55. template <typename U>
  56. void a(Base<U>& base)
  57. {
  58. cout << "a(Base<U>&)" << endl;
  59. base.b();
  60. }
  61. };
  62.  
  63.  
  64. int main()
  65. {
  66. D2 derivated;
  67. Selector<D2> s;
  68. s.a(derivated);
  69. return 0;
  70. }
  71.  
Success #stdin #stdout 0.02s 2724KB
stdin
Standard input is empty
stdout
a(Base<U>&)