Обобщённые лямбда-выражения и замыкания в C++14
Пишите обобщённые лямбда-выражения с параметрами auto и анализируйте типы замыканий.
«Обобщённые лямбда-выражения и замыкания в C++14» — бесплатный урок C++ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Обобщённые лямбда-выражения
В C++14 в списке параметров лямбда-выражения можно писать auto. Компилятор генерирует шаблонный operator() — лямбда-выражение принимает значения любого типа.
auto print = [](const auto& x) {
std::cout << x << "\n";
};
print(42);
print("hello");
print(3.14);Как это работает
Лямбда-выражение превращается в класс с шаблонным operator(). Для каждой уникальной комбинации типов под капотом создаётся отдельная функция.
Варианты использования
Обобщённые лямбда-выражения особенно полезны в алгоритмах, работающих с несколькими типами.
std::vector<int> ints = {1, 2, 3};
std::vector<std::string> strs = {"a", "b"};
auto printAll = [](const auto& container) {
for (const auto& x : container) std::cout << x << " ";
};
printAll(ints);
printAll(strs);Несколько параметров auto
Каждый auto независим — разные параметры могут получить разные типы.
auto add = [](auto a, auto b) {
return a + b;
};
std::cout << add(1, 2.5); // 3.5
std::cout << add(std::string("Hi"), "!"); // Hi!Замыкания — это объекты
Каждое лямбда-выражение создаёт замыкание — экземпляр уникального класса, сгенерированного компилятором. Замыкание хранит захваченные переменные в качестве членов.
Уникальный тип для каждого лямбда-выражения
У каждого лямбда-выражения уникальный тип, даже если два выражения имеют идентичный текст. Нельзя напрямую записать имя типа — используйте auto или std::function.
Хранение лямбда-выражений в std::function
Чтобы хранить лямбда-выражение в переменной с известным типом, оберните его в std::function. Это добавляет небольшие накладные расходы, но обеспечивает полиморфизм времени выполнения для вызываемых объектов.
#include <functional>
std::function<int(int)> doubler = [](int x) { return x * 2; };Стоимость стирания типа
std::function использует стирание типа: он может хранить любой совместимый вызываемый объект, но добавляет выделение памяти в куче и виртуальный вызов. Не используйте его в горячих циклах.
Когда достаточно auto
Для короткоживущих лямбда-выражений (передаваемых алгоритмам или хранящихся в auto) стирание типа не требуется и накладных расходов нет.
Возврат лямбда-выражений
Используйте auto в качестве возвращаемого типа, чтобы вернуть лямбда-выражение. Каждый вызов создаёт новое замыкание.
auto makeAdder(int n) {
return [n](int x) { return x + n; };
}
auto add5 = makeAdder(5);
std::cout << add5(10); // 15Функции высшего порядка
Лямбда-выражения превращают C++ в удобную среду для функций высшего порядка — функций, принимающих или возвращающих другие функции.
Быстрая проверка
Что означает auto в списке параметров лямбда-выражения C++14?
Итоги
Обобщённые лямбда-выражения C++14 используют параметры auto для полиморфизма во время компиляции. Каждое лямбда-выражение имеет уникальный тип замыкания: используйте auto для его хранения или std::function, когда требуется стирание типа.
Изучай C++ с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 51
- Уроки
- 203
Часто задаваемые вопросы
Урок «Обобщённые лямбда-выражения и замыкания в C++14» бесплатный?
Да — полный текст урока «Обобщённые лямбда-выражения и замыкания в C++14» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Обобщённые лямбда-выражения и замыкания в C++14»?
Пишите обобщённые лямбда-выражения с параметрами auto и анализируйте типы замыканий. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Обобщённые лямбда-выражения и замыкания в C++14»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Функциональные объекты и функторы
- Захват в лямбда-выражениях: по значению, по ссылке, mutable
- Обобщённые лямбда-выражения и замыкания в C++14
- std::function: вызываемые объекты со стиранием типа