c++ - 在这种可变参数非类型模板参数的情况下,为什么我需要一个主模板?
问题描述
我试图让这段代码编译,它没有。
#include <array>
#include <type_traits>
template<typename T, int head_size, int... tail_sizes>
struct yarray<T, head_size, tail_sizes...> : public std::conditional_t<sizeof...(tail_sizes) == 0,
std::array<T, head_size>,
std::array<yarray<T, tail_sizes...>, head_size>>
{};
error: 'yarray' is not a class template
4 | struct yarray<T, head_size, tail_sizes...> : public std::conditional_t<sizeof...(tail_sizes) == 0,
| ^~~~~~
然后我的一位专家朋友告诉我定义主模板并且它有效。
// primary template
template<typename T, int... tail_sizes>
struct yarray{};
我的问题是为什么需要这个?从我所见,“递归”永远不会碰到空的可变参数包案例,所以我的原始代码具有所需的所有“信息”。
仅仅是“语言规则要求”,还是有其他原因需要这样做?
解决方案
事实证明,有一个 hack 可以使这样的 工作,我的朋友帮助我得到了这个 hack/解决方法。
constexpr int terminate = 123456789;
template<typename T, int head_size, int tail_head=terminate, int... tail_sizes>
struct yyarray:
public std::conditional_t<tail_head == terminate,
std::array<T, head_size>,
std::array<yyarray<T, tail_head, tail_sizes...>, head_size>>
{};
但正如评论所说,我最初的问题的答案是否定的,你不能有模板专业化,即使它“明显”它应该如何表现。
推荐阅读
- pip - 如何为 pip 设置超时,以便我可以在不可靠的 Internet 连接上下载包?
- c# - Guid.NewGuid() 在 Parallel.For 循环中使用时返回重复值
- ios - SwiftUI:将动态数据传递给内容视图后重绘
- keycloak - 钥匙斗篷模拟
- ios - 如何设置/更改 CGImage 上的 alphaInfo?
- reactjs - React 项目无法在 git 子模块中使用节点模块
- tensorflow - 为什么 SSD 在数据增强期间会调整随机作物的大小?
- java - 从 EC 点和 ECParameterSpec 构造 EC 公钥会给出无效的 x 值
- ios - Flutter on Mac OS 软件包问题
- python - 为什么安装pysam python包失败?