如何在 C++ 中“重载”模板化别名声明?

问题描述

我想创建一个类型别名 array_t。它应该适用于有界和无界数组。我可以像这样为每个案例分别声明:

// Type of an unbounded array of `T`
template <typename T>
using array_t = T[];
// Type of an array of `T` of size `Size`
template <typename T,size_t Size>
using array_t = T[Size];

问题是两者不能同时声明。我认为解决方案可能是使用某种模板专业化,但我不确定在这种情况下如何使用它。

解决方法

根据 cppreference (https://en.cppreference.com/w/cpp/language/type_alias)

不可能部分或明确地特化别名模板。

但是,可以使用非类型模板参数包,因此我们可以使用以下技巧:

template <class T,size_t... Sizes>
struct array_t_helper
{
    using t = void;
};

template <class T,size_t Size>
struct array_t_helper<T,Size>
{
    using t = T[Size];
};

template <class T>
struct array_t_helper<T>
{
    using t = T[];
};

template <typename T,size_t... Sizes>
using array_t = typename array_t_helper<T,Sizes...>::t;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...