template <const int N>
struct UnrolledOp
{
template <const int j, int op(int*, int*)>
static void Do(int* foo, int* l, int* r)
{
return UnrolledOp<N - 1>::template Do<j + 4, op>(foo, l, r);
}
};
template <>
struct UnrolledOp<0>
{
template <const int j, int op(int*, int*)>
static void Do(int* foo, int* l, int* r) { }
};
template <const int fooSize, int op(int*, int*)>
void Op(int* foo, int* l, int* r)
{
UnrolledOp<fooSize / 4>::template Do<0, op>(foo, l, r);
}
int Test(int* x, int* y)
{
return 0;
}
int main()
{
Op<16, Test>(nullptr, nullptr, nullptr);
return 0;
}
dGVtcGxhdGUgPGNvbnN0IGludCBOPgpzdHJ1Y3QgVW5yb2xsZWRPcAp7CiAgICB0ZW1wbGF0ZSA8Y29uc3QgaW50IGosIGludCBvcChpbnQqLCBpbnQqKT4KICAgIHN0YXRpYyB2b2lkIERvKGludCogZm9vLCBpbnQqIGwsIGludCogcikKICAgIHsKICAgICAgICByZXR1cm4gVW5yb2xsZWRPcDxOIC0gMT46OnRlbXBsYXRlIERvPGogKyA0LCBvcD4oZm9vLCBsLCByKTsKICAgIH0KfTsKCnRlbXBsYXRlIDw+CnN0cnVjdCBVbnJvbGxlZE9wPDA+CnsKICAgIHRlbXBsYXRlIDxjb25zdCBpbnQgaiwgaW50IG9wKGludCosIGludCopPgogICAgc3RhdGljIHZvaWQgRG8oaW50KiBmb28sIGludCogbCwgaW50KiByKSB7IH0KfTsKCnRlbXBsYXRlIDxjb25zdCBpbnQgZm9vU2l6ZSwgaW50IG9wKGludCosIGludCopPgp2b2lkIE9wKGludCogZm9vLCBpbnQqIGwsIGludCogcikKewogICAgVW5yb2xsZWRPcDxmb29TaXplIC8gND46OnRlbXBsYXRlIERvPDAsIG9wPihmb28sIGwsIHIpOwp9CgppbnQgVGVzdChpbnQqIHgsIGludCogeSkKewogICAgcmV0dXJuIDA7Cn0KCmludCBtYWluKCkKewogICAgT3A8MTYsIFRlc3Q+KG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpOwogICAgcmV0dXJuIDA7Cn0=