I am attempting to write a dynamic dispatcher for a function that’s templated on integer values (not on types). While I could either write a code generator or use a big macro chain to create the dispatcher source, it seems that a templated solution would be more elegant.
I’ve stripped down my dispatcher to a simple form (which doesn’t actually do any dispatching):
// works fine with full template specialization template <int N> struct TestDispatcher1D { int f(int n) { if (n == N) return n; // replace me with actual dispatch TestDispatcher1D<N-1> t; return t.f(n); } }; template<> struct TestDispatcher1D<-1> { int f(int n) { return -1; } }; // partial template specialization is problematic template <int M, int N> struct TestDispatcher2D { int f(int m, int n); }; template<int M> struct TestDispatcher2D<M,-1> { int f(int m, int n) { return -1; } }; template<int N> struct TestDispatcher2D<-1,N> { int f(int m, int n) { return -1; } }; template<> struct TestDispatcher2D<-1,-1> { int f(int m, int n) { return -1; } }; template <int M, int N> int TestDispatcher2D<M,N>::f(int m, int n) { if ((n == N) && (m == M)) return n + m; // replace me with actual dispatch if (m < M) { if (n < N) { TestDispatcher2D<M-1,N-1> t; return t(m,n); } else { TestDispatcher2D<M-1,N> t; return t(m,n); } } else { TestDispatcher2D<M,N-1> t; return t(m,n); } } // test code void testIt() { { TestDispatcher1D<16> t; t.f(16); } { TestDispatcher1D<16>t; t.f(0); } { TestDispatcher2D<16,16>t; t.f(8,8); } }
When compiling this on gcc 4.1.1, I get the following errors:
t.cpp: In member function 'int TestDispatcher2D::f(int, int) [with int M = 16, int N = 16]': t.cpp:63: instantiated from here t.cpp:40: error: no match for call to '(TestDispatcher2D) (int&, int&)' t.cpp:63: instantiated from here t.cpp:43: error: no match for call to '(TestDispatcher2D) (int&, int&)' t.cpp:63: instantiated from here t.cpp:47: error: no match for call to '(TestDispatcher2D) (int&, int&)'
Apparently, when I try to create the recursive objects, the compiler isn’t treating this as a request to instantiate a new template.
Any suggestions?
You’re simply not calling the
f()function in your recursive call, you’re trying to ‘call the object’:You write:
But you want: