Есть ли элегантный способ специализировать шаблон на основе одного из параметров шаблона?
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;
}
};
Т.е. Я пытаюсь специализировать шаблон на основе параметра, который делится на 5. Единственный способ, которым я могу это сделать, выглядит следующим образом:
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;
}
};
Но это значительно менее элегантно, а также требует создания экземпляров всех шаблонов, даже если аргумент шаблона этого не требует.