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.