c++ - A type trait for std::array -


i trying define type trait can use static_assert control 1 of template classes instantiated std::array<t,n>. here attempt:

template <typename t> struct is_std_array : public false_type {};  template <template <typename, size_t> class t, typename v, size_t n> struct is_std_array<std::array<v, n>> : public true_type {}; 

but following warning clang:

warning: class template partial specialization contains template parameter cannot deduced; partial specialization never used non-deductible template parameter 't' 

why 't' not deductible? how fix that?

your syntax on specializing wrong:

template <template <typename, size_t> class t, typename v, size_t n> 

you're introducing three template parameters here: first of template template parameter named t, takes 2 parameters: type , size_t. since t not referenced anywhere in specialization clause:

struct is_std_array<std::array<v, n>> // <== no t 

it's non-deduced context. think of equivalently written function:

template <template <typename, size_t> class t, typename v, size_t n> void foo(std::array<v, n> ); 

here, also, t non-deduced context , have specified explicitly. however, don't need t @ all! v , n. mean introduce 2 relevant parameters directly:

template <typename v, size_t n> struct is_std_array<std::array<v, n>> : public true_type {}; 

Comments