Частичная специализация шаблона: почему некоторые переменные в списке частичной специализации отличаются от основного шаблона - PullRequest
0 голосов
/ 05 марта 2019

Я узнаю о частичной специализации шаблонов из cppreference, и я понимаю, что количество аргументов из шаблонов частичной специализации должно совпадать с первичным, и список аргументов не может совпадать с не специализированным аргументом. Однако меня сбивают с толку именования переменных. В коде ниже:

template<class T1, class T2, int I>
class A {};            // primary template

template<class T, int I>
class A<T, T*, I> {};  // #1: partial specialization where T2 is a pointer to T1

template<class T, class T2, int I>
class A<T*, T2, I> {}; // #2: partial specialization where T1 is a pointer

template<class T>
class A<int, T*, 5> {}; // #3: partial specialization where T1 is int, I is 5,
                        //     and T2 is a pointer

template<class X, class T, int I>
class A<X, T*, I> {};   // #4: partial specialization where T2 is a pointer

Я не понимаю, почему Т и Х используются вместо Т1, например, какова цель.

1 Ответ

0 голосов
/ 05 марта 2019

В специализации шаблона имя, которое вы выбираете для аргументов шаблона, является переменными без вывода сообщений.Все следующее точно эквивалентно:

template<class T, class U, int N> class A<T, U, N> { /*...*/ };
template<class U, class T, int N> class A<U, T, N> { /*...*/ };
template<class F, class G, int Z> class A<F, G, Z> { /*...*/ };
template<class OnceUpon, class ATime, int ThereWere> class A<OnceUpon, ATime, ThereWere> { /*...*/ };

В частности, имена , которые вы выбираете, не должны совпадать с именем "оригинального" шаблонаопределение.


В комментариях вы спросили:

В коде из моего вопроса № 1 и № 3 есть 2 и 1 список параметров соответственно.Например, почему бы не включить другие переменные, которые были в списке параметров для основного шаблона?

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

Это шаблонный класс:

template<class T1, class T2>
struct X
{};

Вот его конкретная специализация:

X<int, int>;

Теперь, допустим, я хочучтобы определить поведение для X<T1, T2> с T1 == T2, это означает не только X<int, int>, но также X<double, double>, X<float&, float&>, X<std::string, std::string> и всю бесконечность этих явных специализаций.

Для этого мне нужно определить частичную специализацию, которая зависит от одного типа (который играет роли как T1, так и T2).Таким образом, эта специализация будет введена template<class T>: только один тип:

template<class T>
struct X<T, T>
{ using type = T; };

Если бы вы использовали два параметра (template<class T, class WhatToDoWithThatType>), что бы использовать второй?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...