fork download
  1. #include <iostream>
  2.  
  3. #define reflect_base(t) \
  4.   typedef t base_type; \
  5.   typedef t type;
  6.  
  7. #define reflect(t) \
  8.   typedef typename t::type base_type; \
  9.   typedef t type;
  10.  
  11. template <typename R, typename P, typename = typename R::base_type>
  12. struct inherit_base_pattern : public P { };
  13. template <typename R, typename P>
  14. struct inherit_base_pattern<R, P, R> { };
  15.  
  16. template <int I1, int I2>
  17. struct adder { reflect_base(adder) };
  18.  
  19. template <int I1, int I2>
  20. struct adder1 : public adder<I1, I2> { reflect(adder1) };
  21.  
  22. template <int I1, int I2>
  23. struct adder2 : public adder<I1, I2> { reflect(adder2) };
  24.  
  25. template <typename A, int I>
  26. struct fusedmultiplyadder
  27. : public inherit_base_pattern< A, fusedmultiplyadder<typename A::base_type, I> >
  28. { reflect_base(fusedmultiplyadder) };
  29.  
  30. template <int i1, int i2, int i3>
  31. void foo(fusedmultiplyadder<adder<i1, i2>, i3>)
  32. {
  33. std::cout << "fma: " << i1 << ", " << i2 << ", " << i3 << std::endl;
  34. }
  35.  
  36. int main()
  37. {
  38. fusedmultiplyadder<adder1<2, 3>, 4> fma1;
  39. foo(fma1);
  40. fusedmultiplyadder<adder2<2, 3>, 4> fma2;
  41. foo(fma2);
  42. return 0;
  43. }
Success #stdin #stdout 0s 2884KB
stdin
Standard input is empty
stdout
fma: 2, 3, 4
fma: 2, 3, 4