<MyRusakov.ru />

WordPress 6 с Нуля до Гуру

WordPress 6 с Нуля до Гуру

Этот курс научит Вас созданию самых разных сайтов на самой популярной в мире CMS - WordPress. Вы увидите установку и настройку локального сервера, разбор каждой настройки, каждой кнопки и каждого пункта меню в панели WordPress.

Также Вы получите и всю практику, поскольку прямо в курсе с нуля создаётся полноценный Интернет-магазин, который затем публикуется в Интернете. И всё это прямо на Ваших глазах.

Помимо уроков к курсу идут упражнения для закрепления материала.

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

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Шаблоны функций в C++: как писать универсальный код без дублирования

Шаблоны функций в C++: как писать универсальный код без дублирования

Поисковый запрос, на который отвечает эта статья: «шаблоны функций C++ для начинающих». Шаблоны функций в C++ нужны, когда логика одна и та же, а типы данных разные. Вместо трёх функций для int, double и std::string можно написать одну универсальную функцию.

Зачем нужны шаблоны функций

Представьте, что вам нужна функция, возвращающая большее из двух значений. Без шаблонов код быстро начинает дублироваться:

int maxInt(int a, int b) {
    return a > b ? a : b;
}

double maxDouble(double a, double b) {
    return a > b ? a : b;
}

Логика одинаковая, отличаются только типы. Шаблон функции решает эту проблему.

Простейший шаблон функции

Синтаксис начинается с ключевого слова template, после которого указывается параметр типа:

#include <iostream>
#include <string>

template <typename T>
T maxValue(T a, T b) {
    return a > b ? a : b;
}

int main() {
    std::cout << maxValue(10, 25) << '\n';          // int
    std::cout << maxValue(3.5, 2.1) << '\n';       // double
    std::cout << maxValue(std::string("cat"), std::string("dog")) << '\n';
}

T — это не конкретный тип, а «заготовка». При вызове maxValue(10, 25) компилятор понимает, что T — это int. При вызове с double создаётся версия для double.

typename или class: что выбрать

В шаблонах функций можно писать и typename, и class:

template <typename T>
T square(T x) {
    return x * x;
}

template <class T>
T cube(T x) {
    return x * x * x;
}

Для параметра типа в обычном шаблоне функции разницы почти нет. В современном C++ чаще используют typename, потому что оно лучше передаёт смысл: параметр может быть не только классом, но и int, double, bool и т.д.

Вывод типа и явное указание типа

Обычно компилятор сам выводит тип:

std::cout << square(5) << '\n';     // T = int
std::cout << square(2.5) << '\n';   // T = double

Но иногда тип можно указать явно:

std::cout << square<double>(5) << '\n'; // 5 преобразуется в double

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

Шаблон с несколькими типами

Если аргументы могут быть разных типов, используйте несколько параметров шаблона:

#include <iostream>

template <typename T, typename U>
auto add(T a, U b) {
    return a + b;
}

int main() {
    std::cout << add(10, 2.5) << '\n'; // результат double
    std::cout << add(3, 4) << '\n';    // результат int
}

Здесь возвращаемый тип указан как auto, и компилятор сам определяет результат выражения a + b.

Передача по const-ссылке

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

#include <iostream>
#include <string>

template <typename T>
void printTwice(const T& value) {
    std::cout << value << ' ' << value << '\n';
}

int main() {
    std::string name = "Alex";
    printTwice(name);
    printTwice(42);
}

const T& означает: «не копировать объект и не изменять его». Это хороший вариант для функций, которые только читают аргумент.

Практический пример: печать массива std::array

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

#include <array>
#include <iostream>

template <typename T, std::size_t N>
void printArray(const std::array<T, N>& arr) {
    for (const auto& item : arr) {
        std::cout << item << ' ';
    }
    std::cout << '\n';
}

int main() {
    std::array<int, 3> numbers{1, 2, 3};
    std::array<std::string, 2> words{"C++", "templates"};

    printArray(numbers);
    printArray(words);
}

Здесь T — тип элемента, а N — размер массива. Компилятор выводит оба параметра автоматически.

Частая ошибка: разные типы в одном T

Такой код может не скомпилироваться:

template <typename T>
T maxValue(T a, T b) {
    return a > b ? a : b;
}

int main() {
    auto x = maxValue(10, 2.5); // ошибка: T не может быть сразу int и double
}

Решения два: привести типы явно или сделать шаблон с двумя параметрами:

auto x = maxValue<double>(10, 2.5);

Или так:

template <typename T, typename U>
auto maxMixed(T a, U b) {
    return a > b ? a : b;
}

Где хранить шаблонные функции

Важный момент для новичков: определения шаблонных функций обычно размещают в заголовочных файлах .h или .hpp, а не только в .cpp. Причина в том, что компилятору нужно видеть полный код шаблона в месте его использования, чтобы создать конкретную версию функции.

Советы и лучшие практики

  • Используйте шаблоны, когда алгоритм одинаковый для разных типов.
  • Не превращайте простой код в шаблонный без необходимости: читаемость важнее «универсальности».
  • Для крупных объектов передавайте параметры как const T&.
  • Проверяйте, какие операции требуются от типа: если внутри есть a > b, тип должен поддерживать оператор >.
  • Если ошибки компиляции стали слишком длинными, упростите шаблон и проверьте его на одном типе.

Если вы хотите не просто выучить синтаксис, а уверенно применять шаблоны, STL, классы и современный C++ в реальных задачах, посмотрите курс «Программирование на C++ с Нуля до Гуру» — пошаговый путь от основ к уверенной практике.

Итог

Шаблоны функций в C++ позволяют писать универсальный код без дублирования. Они особенно полезны для математических функций, алгоритмов, работы с контейнерами и библиотечного кода. Главное — начинать с простых примеров, понимать вывод типов и помнить: шаблон работает только с теми типами, которые поддерживают используемые внутри операции.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (https://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: https://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: https://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

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

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.