Introduction to Template Specialization
Свайпніть щоб показати меню
Загальний шаблон працює з будь-яким типом даних. Однак певні типи можуть вимагати особливого підходу. Наприклад, якщо реалізується функція, яка поводиться по-різному для типів int та std::string, спеціалізація шаблону дозволяє визначити окрему версію шаблону для кожного типу.
main.cpp
123456789101112#include <iostream> template<typename T> T square(T value) { return value * value; } int main() { std::cout << square<int>(25); std::cout << square<std::string>("5"); }
Якщо запустити наведений вище код, виникне помилка. Це відбувається тому, що std::string не підтримує оператор *. Тому необхідно повідомити компілятор, як обробляти std::string, переданий як параметр.
Як працюють шаблони на низькому рівні
Зараз ви лише ознайомлюєтеся з основами шаблонів, зокрема з шаблонами функцій. Ви дізналися, як їх створювати, використовувати списки параметрів і викликати функції з різними типами даних. Можливо, ви замислювалися, чому в цьому випадку не перевантажити функції для всіх доступних числових типів у C++. Хоча цей підхід міг би спрацювати для даного прикладу, важливо пам’ятати, що шаблони — набагато потужніший інструмент.
main.cpp
12345678910111213#include <iostream> struct myStruct {}; class myClass {}; template<typename T> void TemplateFunction() { std::cout << typeid(T).name() << std::endl; } int main() { TemplateFunction<myClass>(); TemplateFunction<myStruct>(); }
Шаблони можуть приймати будь-які типи даних, включаючи користувацькі типи. Натомість, якщо покладатися лише на перевантаження функцій, доведеться створювати окрему функцію для кожного типу, що ускладнює оновлення та є схильним до помилок. Тому ми не можемо покладатися лише на перевантаження функцій і повинні використовувати спеціалізації шаблонів для вирішення таких питань, як у функції-шаблоні square.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат