如何在 C++ 中 "overload" 模板化别名声明?
How to "overload" templated alias declaration in 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)
It is not possible to partially or explicitly specialize an alias template.
但是,可以使用非类型模板参数包,所以我们可以使用以下技巧:
template <class T, size_t... Sizes>
struct array_t_helper
{ };
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;
我想创建类型别名 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)
It is not possible to partially or explicitly specialize an alias template.
但是,可以使用非类型模板参数包,所以我们可以使用以下技巧:
template <class T, size_t... Sizes>
struct array_t_helper
{ };
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;