#include <iostream>
 
template <int I1, int I2>
class adder { };
 
template <int I1, int I2>
class adder1 : public adder<I1, I2> { };
 
template <int I1, int I2>
class adder2 : public adder<I1, I2> { };
 
template <typename A, int I>
class fusedmultiplyadder { };
 
template <int i1, int i2, int i3>
void foo(fusedmultiplyadder<adder<i1, i2>, i3>)
{
   std::cout << "fma: " << i1 << ", " << i2 << ", " << i3 << std::endl;
}
 
int main()
{
   fusedmultiplyadder<adder1<2, 3>, 4> fma1;
   foo(fma1);
   fusedmultiplyadder<adder2<2, 3>, 4> fma2;
   foo(fma2);
   return 0;
}