Часткова спеціалізація шаблонів
Свайпніть щоб показати меню
Спеціалізація шаблону для шаблону з одним параметром є простою, але з кількома параметрами вона ускладнюється. У таких випадках використовується часткова спеціалізація шаблону. Вона дозволяє створювати спеціалізовану версію шаблону для певних підмножин типів або значень.
main.cpp
12345678// What if `T1` and `T2` are the same type? // Or what if you want to define special behavior when `T1` is a `std::string`? template<typename T1, typename T2> void TemplateExample(T1 first, T2 second) { std::cout << "Generic template!" << std::endl; }
Синтаксис часткової спеціалізації шаблону
Часткову спеціалізацію шаблону можна розглядати як різновид перевантаження шаблону. Ось основні правила:
У частковій спеціалізації визначається нова версія шаблонної функції, у якій деякі параметри фіксуються до конкретних типів, а інші залишаються універсальними. Компілятор використовує цю спеціалізовану версію щоразу, коли під час інстанціювання шаблону зустрічає відповідні типи.
main.cpp
123456789101112131415#include <iostream> // Primary template template<typename T1, typename T2> bool IsSameType(T1 first, T2 second) { return false; } // Partial specialization for when both types are the same template<typename T> bool IsSameType(T first, T second) { return true; } int main() { std::cout << IsSameType(10, 'a') << std::endl; std::cout << IsSameType("Hello", "World") << std::endl; }
Це один зі способів використання спеціалізації шаблонів, але існує й інший, більш поширений сценарій.
main.cpp
123456789101112131415#include <iostream> // Primary template template <typename T1, typename T2> // General case void Template(T1 a, T2 b) { std::cout << "General" << std::endl; } // Partial specialization for when `T1` is `bool` template <typename T2> // Special case when the first type is `bool` void Template(bool a, T2 b) { std::cout << "Special" << std::endl; } int main() { Template(false, 25); Template(100, 300); }
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат