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>::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>::Do<0, op>(foo, l, r);
}
int Test(int* x, int* y)
{
return 0;
}
int main()
{
Op<16, Test>(nullptr, nullptr, nullptr);
return 0;
}
dGVtcGxhdGUgPGNvbnN0IGludCBOPgpzdHJ1Y3QgVW5yb2xsZWRPcAp7CiAgICB0ZW1wbGF0ZSA8Y29uc3QgaW50IGosIGludCBvcChpbnQqLCBpbnQqKT4KICAgIHN0YXRpYyB2b2lkIERvKGludCogZm9vLCBpbnQqIGwsIGludCogcikKICAgIHsKICAgICAgICByZXR1cm4gVW5yb2xsZWRPcDxOIC0gMT46OkRvPGogKyA0LCBvcD4oZm9vLCBsLCByKTsKICAgIH0KfTsKCnRlbXBsYXRlIDw+CnN0cnVjdCBVbnJvbGxlZE9wPDA+CnsKICAgIHRlbXBsYXRlIDxjb25zdCBpbnQgaiwgaW50IG9wKGludCosIGludCopPgogICAgc3RhdGljIHZvaWQgRG8oaW50KiBmb28sIGludCogbCwgaW50KiByKSB7IH0KfTsKCnRlbXBsYXRlIDxjb25zdCBpbnQgZm9vU2l6ZSwgaW50IG9wKGludCosIGludCopPgp2b2lkIE9wKGludCogZm9vLCBpbnQqIGwsIGludCogcikKewogICAgVW5yb2xsZWRPcDxmb29TaXplIC8gND46OkRvPDAsIG9wPihmb28sIGwsIHIpOwp9CgppbnQgVGVzdChpbnQqIHgsIGludCogeSkKewogICAgcmV0dXJuIDA7Cn0KCmludCBtYWluKCkKewogICAgT3A8MTYsIFRlc3Q+KG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpOwogICAgcmV0dXJuIDA7Cn0=
prog.cpp: In static member function ‘static void UnrolledOp<N>::Do(int*, int*, int*)’:
prog.cpp:7:58: error: comparison between distinct pointer types ‘int (*)(int*, int*)’ and ‘int*’ lacks a cast [-fpermissive]
return UnrolledOp<N - 1>::Do<j + 4, op>(foo, l, r);
^
prog.cpp: In function ‘void Op(int*, int*, int*)’:
prog.cpp:21:49: error: comparison between distinct pointer types ‘int (*)(int*, int*)’ and ‘int*’ lacks a cast [-fpermissive]
UnrolledOp<fooSize / 4>::Do<0, op>(foo, l, r);
^
prog.cpp: In instantiation of ‘void Op(int*, int*, int*) [with int fooSize = 16; int (* op)(int*, int*) = Test]’:
prog.cpp:31:43: required from here
prog.cpp:21:32: error: invalid operands of types ‘<unresolved overloaded function type>’ and ‘int’ to binary ‘operator<’
UnrolledOp<fooSize / 4>::Do<0, op>(foo, l, r);
~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
prog.cpp:21:38: error: comparison between distinct pointer types ‘int (*)(int*, int*)’ and ‘int*’ lacks a cast [-fpermissive]
UnrolledOp<fooSize / 4>::Do<0, op>(foo, l, r);
~~^~~~~~~~~~~~