A type trait for std::array
A type trait for std::array
我试图定义一个类型特征,我可以使用static_assert
来控制我的模板类之一仅与s td::array<T,n>
实例化。下面是我的尝试:
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 {};
但是我从clang中得到以下警告:
warning: class template partial specialization contains a template parameter
that cannot be deduced; this partial specialization will never be used
non-deductible template parameter 'T'
为什么'T'不可免赔?我该如何解决这个问题?
你的专门化语法是错误的:
template <template <typename, size_t> class T, typename V, size_t n>
您在这里引入了三个模板参数:第一个是名为T
的模板模板参数,它接受两个参数:一个类型和一个size_t
。因为T
在你的专门化子句中没有被引用:
struct is_std_array<std::array<V, n>> // <== no T
是一个非推导的上下文。考虑同样编写的函数:
template <template <typename, size_t> class T, typename V, size_t n>
void foo(std::array<V, n> );
这里,T
也是一个非推导的上下文,因此必须显式指定。然而,您实际上根本不需要T
!只有V
和n
。您的意思是直接引入两个相关参数:
template <typename V, size_t n>
struct is_std_array<std::array<V, n>> : public true_type {};
相关文章:
- C++11 中不同类型的对象的 std::array 的替代方案
- constexpr begin of a std::array
- C++如果必须在编译时确定大小,std::array 有什么意义?
- 标准::unordered_map 中的 std::array 的值初始化
- 确保编译时的特定 std::array 位置
- std::array的长度有大小限制吗?
- 将 std::array 移动到另一个 std::array
- 为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays
- std::bind on statd::array 的运算符 []
- 检查输入 std::array 指针数据是否等于某个常量数组
- 如何读/写或遍历 std::array 中的特定元素范围?
- 是否可以使用 std::array 作为 POD 结构的数据容器?
- 如何在C++中传递一个大小未知的 std::array?
- 在现代C++中将 std::array<std:::array<T,N>> 转换为 std::vector<T>
- 在 C++ 中访问 std::array<std::array> 元素
- 将标量+std::array+std::tuple转换为一个大元组
- 如何初始化 std::array<std::array<T, 2>, 2> 的对象?
- 初始化 std::p air<double, std::array<std::p air<double, double>, 3> >
- 单独移动数组(raw array, std::array, std::vector)的每个元素
- 包装方法返回 c++ std::array<std::string, 4> in cython