#include <iostream>

template <int I1, int I2>
struct adder
{
   static const int i1 = I1;
   static const int i2 = I2;
};

template <typename A, int I>
struct fusedmultiplyadder
{
   typedef A a;
   static const int i = I;
};

template <typename a, int i>
void foo(fusedmultiplyadder<a, i>)
{
   std::cout << "fma: " << a::i1 << ", " << a::i2 << ", " << i << std::endl;
}

int main()
{
   fusedmultiplyadder<adder<2, 3>, 4> fma;
   foo(fma);
   return 0;
}