Разница между экземпляром и специализацией в шаблонах С++ - программирование
Подтвердить что ты не робот

Разница между экземпляром и специализацией в шаблонах С++

В чем разница между специализацией и конкретизацией в контексте шаблонов С++. Из того, что я прочитал до сих пор, я понял, что я понял о специализации и создании экземпляров.

template <typename T>
struct Struct
{

     T x;
};

template<>
struct Struct <int> //specialization
{

    //code
};

int main()
{
   Struct <int> s; //specialized version comes into play
   Struct <float> r; // Struct <float> is instantiated by the compiler as shown below

}

Активация Struct <float> компилятором

template <typename T=float>
struct Struct
{
    float x;
}

Я правильно понял понимание экземпляра шаблона и специализацию?

4b9b3361

Ответ 1

4 понятия:

(неявный) экземпляр: это то, что вы называете экземпляром

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

template Struct<char>; //used to control the PLACE where the template is inst-ed

(явная) специализация: это то, что вы называете специализацией

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

template<class T> class Struct<T*> {...} //partial specialization for pointers

Ответ 2

В чем разница между специализацией и конкретизацией в контексте шаблонов С++?

Обычно (при отсутствии специальных специализаций) компилятор будет создавать экземпляры шаблона при их использовании, заменив фактические параметры шаблона (int в вашем примере) для формальных параметров шаблона (T), а затем скомпилируйте полученный код.

Если присутствует специализация, то для (набора) специальных параметров шаблона (ов), заданных этой специализацией, эта реализация специализации должна использоваться вместо того, что создавал компилятор.

Ответ 3

Специализация шаблона фактически изменяет поведение шаблона для определенного типа. например, преобразовать в строку:

template<typename T> std::string convertToString( const T& t )
{
   std::ostringstream oss;
   oss << t;
   return oss.str();
}

Давайте специализироваться на том, что, хотя наш тип уже является std::string, поскольку он бессмысленно проходит через ostringstream

template<> std::string convertToString( const std::string & t )
{
   return t;
}

Вы также можете специализироваться на занятиях.

Теперь экземпляр: это делается для того, чтобы вы могли переместить компиляцию для определенных типов в один блок компиляции. Это может сэкономить вам время компиляции, а иногда и наложение кода. Скажем, мы делаем вышеприведенное в класс StringConvert, а не функцию.

template<typename T>
class StringConvert
{
 public:
  // 4 static functions to convert from T to string, string to T,
   // T to wstring and wstring to T using streams
 };

Мы преобразуем много целых чисел в строки, чтобы мы могли его создать: Поместите это внутри одного заголовка

 extern template class StringConvert<int>;

Поместите это внутри одного блока компиляции:

 template class StringConvert<int>;

Обратите внимание, что вышеизложенное также может быть выполнено (без внешнего заголовка) с функциями, которые на самом деле не реализованы в строке. Один из ваших блоков компиляции будет реализовывать их. Однако тогда ваш шаблон ограничен только экземплярами. Иногда выполняется, когда шаблон имеет виртуальный деструктор.

Ответ 4

Обзор

  • Специализация: член класса, функции или класса, который вы получаете при замене аргументов шаблона в параметры шаблона шаблона или шаблона функции.

  • Активация: акт создания специализации из шаблона или члена шаблона класса. Специализация может быть создана из частичной специализации, члена шаблона класса или из основного класса или шаблона функции.

Явная специализация - это функция, которая явно определяет класс, функцию или член, без создания экземпляра.

Ответ 5

В С++ 11.

конкретизации:

Создайте экземпляр шаблона с заданными аргументами шаблона

template <typename T>
struct test{ T m; };

template test<int>;//explicit instantiation

которые приводят к определению структуры с идентификатором test<int>

test<int> a;//implicit instantiation

если template <typename T> struct test был создан с аргументом T = int до (явным или неявным), то это просто экземпляр структуры. В противном случае он будет инстанцировать template <typename T> struct test с аргументом T = int сначала неявно, а затем создать экземпляр объекта struct test<int>

специализация:

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

template <typename T>
struct test{ T m; };
template <> struct test<int>{ int newM; } //specialization

Наиболее полезной для специализации шаблона является то, что вы можете создавать разные шаблоны для разных аргументов шаблона, что означает , у вас могут быть разные определения класса или функции для разных аргументов шаблона.

template<> struct test<char>{ int cm; }//specialization for char
test<char> a;
a.cm = 1;

template<> struct test<long> { int lm; }//specialization for long
test<long> a;
a.lm = 1;

В дополнение к этой полной специализированной специализации s, там (только шаблон шаблона) также завершается специализация частичного шаблона.

template<typename T>
struct test {};
template <typename T> struct test<const T>{};//partial specialization for const T


template <typename A, typename B>
struct test {};
template <typename B> struct test<int, B>{};//partial specialization for A = int

Ответ 6

Специальный шаблон уже не просто шаблон. Вместо этого это либо фактический класс, либо действительная функция.

Специализация - это либо экземпляр, либо явная специализация, ниже 14.7.4.

Реализация основывается на определении первичного шаблона. Пример создания экземпляра неявного экземпляра класса,

template<typename T>
class foo {}

foo<int> foo_int_object;

Пример явного создания экземпляра шаблона класса,

template class foo<double>;

Явная специализация имеет другое определение из первичного шаблона.

template<>
class foo<bool> {}

//извлечение из стандартного

14 Шаблонов

14.7 Создание экземпляра шаблона и специализация

4 Конкретная специализированная специализация шаблона может быть либо неявно создана (14.7.1) для данного аргумента список или быть явно инстанцированным (14.7.2). Специализация - это класс, функция или член класса, который либо экземпляр или явно специализированный (14.7.3).