#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGludCBJMSwgaW50IEkyPgpzdHJ1Y3QgYWRkZXIKewogICBzdGF0aWMgY29uc3QgaW50IGkxID0gSTE7CiAgIHN0YXRpYyBjb25zdCBpbnQgaTIgPSBJMjsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBBLCBpbnQgST4Kc3RydWN0IGZ1c2VkbXVsdGlwbHlhZGRlcgp7CiAgIHR5cGVkZWYgQSBhOwogICBzdGF0aWMgY29uc3QgaW50IGkgPSBJOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIGEsIGludCBpPgp2b2lkIGZvbyhmdXNlZG11bHRpcGx5YWRkZXI8YSwgaT4pCnsKICAgc3RkOjpjb3V0IDw8ICJmbWE6ICIgPDwgYTo6aTEgPDwgIiwgIiA8PCBhOjppMiA8PCAiLCAiIDw8IGkgPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbigpCnsKICAgZnVzZWRtdWx0aXBseWFkZGVyPGFkZGVyPDIsIDM+LCA0PiBmbWE7CiAgIGZvbyhmbWEpOwogICByZXR1cm4gMDsKfQ==