Я хочу создать псевдоним типа array_t. Он должен работать как для ограниченных, так и для неограниченных массивов. Я могу объявить его для каждого случая отдельно следующим образом:

// Тип неограниченного массива `T`.
шаблон 
using array_t = T[];
// Тип массива `T` размера `Size`
шаблон 
using array_t = T[Size];

Проблема в том, что оба эти понятия не могут быть объявлены одновременно. Я думаю, что решением может быть использование какой-то специализации шаблона, но я не уверен, как использовать ее в данном случае.

Ответы (1)

Согласно cppreference (https://en.cppreference.com/w/cpp/language/type_alias)

Невозможно частично или явно специализировать шаблон псевдонима.

Однако можно использовать пакет параметров шаблона не типа, поэтому мы можем использовать следующий трюк:

template 
struct array_t_helper
{
    using t = void;
};

шаблон 
struct array_t_helper
{
    using t = T[Size];
};

шаблон 
struct array_t_helper
{
    using t = T[];
};

template 
using array_t = typename array_t_helper::t;

2022 WebDevInsider