c++ - std::array 的类型特征

标签 c++ templates c++11

我正在尝试定义一个可以与 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”不可扣除?我该如何解决?

最佳答案

你的 specializing 语法是错误的:

template <template <typename, size_t> class T, typename V, size_t n>

您在这里引入了三个 模板参数:第一个是名为T 的模板template 参数,它有两个参数:类型和 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!只是 Vn。你的意思是直接简单的引入两个相关的参数:

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

关于c++ - std::array 的类型特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32787702/

相关文章:

c++ - 无法使用 Visual C++ 2012 创建有效的 dll

c++ - 将 OpenCV 图像数据类型转换为 Devil 图像格式,反之亦然

c++ - 使用类模板参数比使用实例变量有什么好处?

WPF dataGrid(或ListView)通过绑定(bind)填充,不同的行模板

c++ - 书中好像有矛盾 "C++ Templates - The Complete Guide"

templates - 在使用右值引用时选择要使用的模板重载时的不同行为

c++ - 如何存储将被多个不同类访问的字符串常量?

c++ - 从 C 数组移动到 std::map <int, val> 运算符 `-` 陷阱

c++ - QDockWidget 在启动时自动隐藏

c++ - 为什么打印字符串数组输出十六进制?