#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 adderI1(adder<i1, i2>) { return i1; }
template <int i1, int i2>
int adderI2(adder<i1, i2>) { return i2; }
template <typename A, int i3>
void foo(fusedmultiplyadder<A, i3>)
{
std::cout << "fma: " << adderI1(A()) << ", " << adderI2(A()) << ", " << i3 << std::endl;
}
int main()
{
fusedmultiplyadder<adder1<2, 3>, 4> fma1;
foo(fma1);
fusedmultiplyadder<adder2<2, 3>, 4> fma2;
foo(fma2);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogCnRlbXBsYXRlIDxpbnQgSTEsIGludCBJMj4KY2xhc3MgYWRkZXIgeyB9OwogCnRlbXBsYXRlIDxpbnQgSTEsIGludCBJMj4KY2xhc3MgYWRkZXIxIDogcHVibGljIGFkZGVyPEkxLCBJMj4geyB9OwogCnRlbXBsYXRlIDxpbnQgSTEsIGludCBJMj4KY2xhc3MgYWRkZXIyIDogcHVibGljIGFkZGVyPEkxLCBJMj4geyB9OwogCnRlbXBsYXRlIDx0eXBlbmFtZSBBLCBpbnQgST4KY2xhc3MgZnVzZWRtdWx0aXBseWFkZGVyIHsgfTsKCnRlbXBsYXRlIDxpbnQgaTEsIGludCBpMj4KaW50IGFkZGVySTEoYWRkZXI8aTEsIGkyPikgeyByZXR1cm4gaTE7IH0KdGVtcGxhdGUgPGludCBpMSwgaW50IGkyPgppbnQgYWRkZXJJMihhZGRlcjxpMSwgaTI+KSB7IHJldHVybiBpMjsgfQoKdGVtcGxhdGUgPHR5cGVuYW1lIEEsIGludCBpMz4Kdm9pZCBmb28oZnVzZWRtdWx0aXBseWFkZGVyPEEsIGkzPikKewogICBzdGQ6OmNvdXQgPDwgImZtYTogIiA8PCBhZGRlckkxKEEoKSkgPDwgIiwgIiA8PCBhZGRlckkyKEEoKSkgPDwgIiwgIiA8PCBpMyA8PCBzdGQ6OmVuZGw7Cn0KIAppbnQgbWFpbigpCnsKICAgZnVzZWRtdWx0aXBseWFkZGVyPGFkZGVyMTwyLCAzPiwgND4gZm1hMTsKICAgZm9vKGZtYTEpOwogICBmdXNlZG11bHRpcGx5YWRkZXI8YWRkZXIyPDIsIDM+LCA0PiBmbWEyOwogICBmb28oZm1hMik7CiAgIHJldHVybiAwOwp9