fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct B {};
  5. struct A1 : B { void foo() { cout << "A1::foo()\n"; } };
  6. struct A2 : B { void foo() { cout << "A2::foo()\n"; } };
  7. struct A3 : B { void foo() { cout << "A3::foo()\n"; } };
  8. struct A4 : B { void foo() { cout << "A4::foo()\n"; } };
  9.  
  10. struct C {
  11. A1* p1;
  12. A2* p2;
  13. A3* p3;
  14. A4* p4;
  15. // ...
  16. };
  17.  
  18. template <class D, size_t startNumber, size_t numMembers, bool notFinished>
  19. struct FooCaller;
  20. template <class D, size_t startNumber>
  21. struct FooSingleCall;
  22.  
  23. template <class D, size_t startNumber, size_t numMembers>
  24. struct FooCaller<D, startNumber, numMembers, false> {
  25. void operator() (D& d) {}
  26. };
  27.  
  28. template <class D, size_t startNumber, size_t numMembers>
  29. struct FooCaller<D, startNumber, numMembers, true> {
  30. void operator() (D& d) {
  31. FooSingleCall<D,startNumber>()(d);
  32. FooCaller<D, startNumber + 1, numMembers, startNumber < numMembers>()(d);
  33. }
  34. };
  35.  
  36. #define FooSingleCallD(n) \
  37. template <class D> \
  38. struct FooSingleCall<D,n>{ \
  39.   void operator() (D& d) { \
  40.   d.p##n->foo(); \
  41.   } \
  42. }
  43.  
  44. FooSingleCallD(1);
  45. FooSingleCallD(2);
  46. FooSingleCallD(3);
  47. FooSingleCallD(4);
  48. // ... unfortunately repeat as many times as needed
  49.  
  50. template <class D, size_t numMembers>
  51. void callFoo(D& d)
  52. {
  53. FooCaller<D, 1, numMembers, 1 <= numMembers>()(d);
  54. }
  55.  
  56. int main() {
  57. C c;
  58. callFoo<C,4>(c);
  59. }
  60.  
  61.  
Success #stdin #stdout 0s 2928KB
stdin
Standard input is empty
stdout
A1::foo()
A2::foo()
A3::foo()
A4::foo()