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