私はこのコードを持っています
template<int N, bool C = true>
struct A;
template<int N>
struct A<N, !(N % 5)> {
/* ... */
};
// should work
A<25> a;
つまり、でN
割り切れる数値5
の場合、コンパイラは部分的な特殊化を使用する必要があります。ただし、コンパイラはその部分的な特殊化を受け入れません。これは、標準では、部分的な特殊化の非型引数がパラメータを参照し、単なるパラメータではない(たとえば、A<N, N>
有効である)コードを拒否することを要求しているためです。しかし、そうする理由は何ですか?
コードをもっとわかりやすい例に変更するだけで、有効であることに注意してください。
template<bool> struct wrap;
template<int N, typename = wrap<true> >
struct A;
template<int N>
struct A<N, wrap<!(N % 5)> > {
/* ... */
};
// should work
A<25> a;
型以外のパラメータではなくなったため、これで問題ありません。しかし、仕様がより単純な部分的特殊化を禁止している理由は何ですか?