c++ - 如何获取 std::array 的模板?
问题描述
我编写了一个简单的元程序来检查 2 个模板是否相同。这里是:
template<template<class...> class _Tp, template<class...> class _Up>
struct is_same_template : std::false_type {};
template<template<class...> class _Tp>
struct is_same_template<_Tp, _Tp> : std::true_type {};
它有效(但不适用于 std::array)
is_same_template<std::vector, std::vector>::value // 1
is_same_template<std::map, std::map>::value // 1
is_same_template<std::vector, std::map>::value // 0
is_same_template<std::vector, std::array>::value // Error: type/value mismatch at argument 2
我该如何解决?
解决方案
您可以比较类型:
template<class T1, class T2> struct is_same_template: std::false_type {};
template<template<class, std::size_t> struct StdArray,
class T1, std::size_t n1, class T2, std::size_t n2>
struct is_same_template<StdArray<T1, n1>, StdArray<T2, n2>>: std::true_type {};
或为每个模板签名定义一个单独的比较器:
template<template<class, std::size_t, class...> class T1,
template<class, std::size_t, class...> class T2>
struct is_same_template_T1_n1: std::false_type {};
template<> struct is_same_template_T1_n1<std::array, std::array>: std::true_type {};
一般来说,没有通用的模板接口可以同等地接受类型参数和非类型参数。
推荐阅读
- java - 当未从 java.exe 目录加载本机库时,JNI 引发 StackOverflowExcpetion
- java - Jmeter 行为怪癖
- c++ - 为什么任何事件(例如更改 QLabel 或 QPushButton 的文本)将移动的小部件恢复到它在布局中的第一个位置?
- css - 使用 Bootstrap 5 创建自定义工具提示
- angular - 在formArray Angular中获取值:找不到带有路径的控件
- android - 如何在片段中添加 RecyclerView?
- javascript - 当源视频可见时,带有视频的画布drawImage全屏不起作用
- javascript - 我已经链接了一个 jquery 文件,但我不能使用它
- javascript - 尝试使用 ipfs.add() 将文件上传到 ipfs 时出现“multihash must be a buffer”错误
- visual-studio-code - VS Code:跳转到下一个出现的字符 x