Специализация шаблона на указателе массива с любым уровнем вложенности - PullRequest
1 голос
/ 22 марта 2019

Мне нужно написать специализацию шаблона, которая будет работать с указателями на массивах (эти вещи: 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 И да, извините за мой ужасный английский;это не мой родной язык.

1 Ответ

1 голос
/ 26 марта 2019

Если вас не интересуют другие указатели, вы можете выполнить частичную специализацию, которая делегирует двойные указатели специализации для одиночных указателей:

template<typename Pointee>
struct CoolStruct<Pointee**>{
    static void Print(){
        CoolStruct<Pointee*>::Print();
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...