fork download
  1. #include<iostream>
  2.  
  3. struct B {};
  4. struct C { B m1, m2; };
  5.  
  6. #define TRAIT_C(N, FUNCTION) \
  7.   template<> \
  8.   struct Trait##N<C> \
  9.   { \
  10.   static \
  11.   void foo(C t) \
  12.   { \
  13.   Trait##N<B>::foo(t.m##N); \
  14.   } \
  15.   }
  16.  
  17. template<typename T>
  18. struct Trait1
  19. {
  20. static
  21. void foo(T t)
  22. {}
  23. };
  24.  
  25. template<>
  26. struct Trait1<B>
  27. {
  28. static
  29. void foo(B t)
  30. { std::cout << "Trait1<B>::foo()\n"; }
  31. };
  32. TRAIT_C(1, foo);
  33.  
  34. template<typename T>
  35. struct Trait2
  36. {
  37. static
  38. void foo(T t)
  39. {}
  40. };
  41.  
  42. template<>
  43. struct Trait2<B>
  44. {
  45. static
  46. void foo(B t)
  47. { std::cout << "Trait2<B>::foo()\n"; }
  48. };
  49. TRAIT_C(2, foo);
  50.  
  51. int main ()
  52. {
  53. C c;
  54. Trait1<C> t1c;
  55. t1c.foo(c);
  56. }
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
Trait1<B>::foo()