Is there an elegant way to specialize a template based on one of its template parameters?
Ie.
template<int N> struct Junk { static int foo() { // stuff return Junk<N - 1>::foo(); } }; // compile error: template argument '(size * 5)' involves template parameter(s) template<int N> struct Junk<N*5> { static int foo() { // stuff return N; } }; template<> struct Junk<0> { static int foo() { // stuff return 0; } };
Ie. I am trying to specialize a template based on the parameter being divisible by 5. The only way I can seem to do it is like below:
template<int N> struct JunkDivisibleBy5 { static int foo() { // stuff return N; } }; template<int N> struct Junk { static int foo() { // stuff if ((N - 1) % 5 == 0 && N != 1) return JunkDivisibleBy5<N - 1>::foo(); else return Junk<N - 1>::foo(); } }; template<> struct Junk<0> { static int foo() { // stuff return 0; } };
But this is significantly less elegant, and also necessitates instantiation of all templates even if the template argument shouldn’t require it.
How’s this: