(Partially) specializing a non-type template parameter of dependent type

c++, non-type, partial-specialization, templates

Solution

See paragraph [temp.class.spec] 14.5.5/8 of the standard:

The type of a template parameter corresponding to a specialized non-type argument shall not be dependent on a parameter of the specialization. [ Example:

template <class T, T t> struct C {};
template <class T> struct C<T, 1>; // error

template< int X, int (*array_ptr)[X] > class A {};
int array[5];
template< int X > class A<X,&array> { }; // error

—end example ]

The answer to your edit: the easiest workaround is to replace a non-type template parameter with a type one:

#include <type_traits>

template <typename T, typename U>
struct X_;

template <typename T, T N>
struct X_<T, std::integral_constant<T, N>> {};

template <typename T>
struct X_<T, std::integral_constant<T, 0>> {};

template <typename T, T N>
struct X : X_<T, std::integral_constant<T, N>> {};

Problem

Maybe I'm tired, but I'm stuck with this simple partial specialization, which doesn't work because `non-type template argument specializes a template parameter with dependent type 'T'`: ``` template <typename T, T N> struct X; template <typename T> struct X <T, 0>; ``` Replacing `0` by `T(0)`, `T{0}` or `(T)0` doesn't help. So is this specialization even possible?

Original source