Рубрики

Шаблонная специализация на C ++

Шаблон в C ++ — это особенность. Мы пишем код один раз и используем его для любого типа данных, включая определяемые пользователем типы данных. Например, sort () может быть написан и использован для сортировки элементов любого типа данных. Можно создать стек классов, который можно использовать как стек данных любого типа.
Что если нам нужен другой код для определенного типа данных? Рассмотрим большой проект, которому нужна функция sort () для массивов разных типов данных. Позволяет использовать быструю сортировку для всех типов данных, кроме char. В случае char, возможные значения равны 256, и сортировка по счету может быть лучшим вариантом. Можно ли использовать другой код только тогда, когда sort () вызывается для типа данных char?
В C ++ возможно получить специальное поведение для определенного типа данных. Это называется специализация шаблона .

// Универсальная функция сортировки

template <class T>

void sort(T arr[], int size)

{

    // код для реализации быстрой сортировки

}

  
// Шаблонная специализация: функция
// специализируется на типе данных char

template <>

void sort<char>(char arr[], int size)

{

    // код для реализации подсчета

}

Другим примером может быть класс Set, который представляет набор элементов и поддерживает такие операции, как объединение, пересечение и т. Д. Когда типом элементов является char, мы можем использовать простой логический массив размером 256 для создания набора. Для других типов данных мы должны использовать другой сложный метод.

Пример программы для специализации шаблона функции
Например, рассмотрим следующий простой код, где у нас есть общий шаблон fun () для всех типов данных, кроме int. Для int есть специализированная версия fun ().

#include <iostream>

using namespace std;

  

template <class T>

void fun(T a)

{

   cout << "The main template fun(): " 

        << a << endl;

}

  

template<>

void fun(int a)

{

    cout << "Specialized Template for int type: "

         << a << endl;

}

  

int main()

{

    fun<char>('a');

    fun<int>(10);

    fun<float>(10.14);

}

Выход:

The main template fun(): a
Specialized Template for int type: 10
The main template fun(): 10.14

Пример программы для специализации шаблона класса
В следующей программе специальная версия класса Test написана для типа данных int.

#include <iostream>

using namespace std;

  

template <class T>

class Test

{

  // Данные участников теста

public:

   Test()

   {

       // Инициализация членов данных

       cout << "General template object \n";

   }

   // Другие методы испытаний

};

  

template <>

class Test <int>

{

public:

   Test()

   {

       // Инициализация членов данных

       cout << "Specialized template object\n";

   }

};

  

int main()

{

    Test<int> a;

    Test<char> b;

    Test<float> c;

    return 0;

}

Выход:

Specialized template object
General template object
General template object

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

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

Рекомендуемые посты:

Шаблонная специализация на C ++

0.00 (0%) 0 votes