Мне нужно написать специализацию шаблона, которая будет работать с указателями на массивах (эти вещи: char(*)[]
).И мы напишем этот код для этого
// our class
template<typename T>
struct CoolStruct
{
static void Print(); // will print "Default"
};
//one specialization for sized arrays
template<typename T, size_t S>
struct CoolStruct<T(*)[S]>
{
static void Print(); // will print "T(*)[sized]"
};
// and one for arrays without size
template<typename T>
struct CoolStruct<T(*)[]>
{
static void Print(); // will print "T(*)[]"
};
И когда в нашем коде мы сделаем что-то вроде этого:
int (*arrptr)[10];
CoolClass<decltype(arrptr)>::Print();
Консоль выведет "T (*) [size]«как мы и ожидали (учитывая, что мы написали реализацию для всех методов, конечно).Но что если мы напишем наш код следующим образом:
int (**arrptr_d)[10];
CoolClass<decltype(arrptr_d)>::Print();
В этом случае консоль фактически выведет «Default».Мы могли бы написать другую специализацию, например, такую:
template<typename T, size_t S>
struct CoolStruct<T(**)[S]>
{
static void Print(); // will print "T(*)[sized]"
};
, но я хочу найти другое решение (я не хочу писать еще дюжину специализаций, когда мне нужно будет использовать int(****)[]
).Итак, учитывая, что мы используем стандарт C ++ 17, есть ли способ сделать это?
PS И да, извините за мой ужасный английский;это не мой родной язык.