Generyczne lambdy i domknięcia w C++14
Pisz generyczne lambdy z parametrami auto i analizuj typy domknięć
Generyczne lambdy i domknięcia w C++14 to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Generyczne lambdy
C++14 pozwala używać auto na liście parametrów lambdy. Kompilator generuje szablonowy operator() — lambda akceptuje dowolny typ.
auto print = [](const auto& x) {
std::cout << x << "\n";
};
print(42);
print("hello");
print(3.14);Jak to działa
Lambda staje się klasą z szablonowym operator(). Każda unikatowa kombinacja typów powoduje utworzenie osobnej funkcji wewnątrz programu.
Przypadki użycia
Generyczne lambdy sprawdzają się szczególnie dobrze w algorytmach działających na wielu typach.
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);Wiele parametrów auto
Każde auto jest niezależne — poszczególne parametry mogą zostać rozwinięte do różnych typów.
auto add = [](auto a, auto b) {
return a + b;
};
std::cout << add(1, 2.5); // 3.5
std::cout << add(std::string("Hi"), "!"); // Hi!Domknięcia są obiektami
Każde wyrażenie lambda tworzy domknięcie — instancję unikatowej klasy generowanej przez kompilator. Domknięcie przechowuje wszystkie przechwycone zmienne jako składowe.
Unikatowy typ każdej lambdy
Każde wyrażenie lambda ma unikatowy typ, nawet jeśli dwie lambdy mają identyczny tekst. Nie można bezpośrednio zapisać nazwy tego typu — należy użyć auto lub std::function.
Przechowywanie lambd w std::function
Aby przechować lambdę w zmiennej o znanym typie, należy opakować ją w std::function. Dodaje to niewielki narzut, ale umożliwia polimorfizm w czasie wykonywania dla obiektów wywoływalnych.
#include <functional>
std::function<int(int)> doubler = [](int x) { return x * 2; };Koszt wymazywania typu
std::function używa wymazywania typu — może przechowywać dowolny zgodny obiekt wywoływalny, ale dodaje alokację na stercie i wywołanie wirtualne. Należy unikać go w gorących pętlach.
Kiedy wystarczy auto
W przypadku krótkotrwałych lambd (przekazywanych do algorytmów lub przechowywanych w auto) wymazywanie typu nie jest potrzebne, więc nie występuje dodatkowy narzut.
Zwracanie lambd
Należy użyć auto jako typu zwracanego, aby zwrócić lambdę. Każde wywołanie tworzy nowe domknięcie.
auto makeAdder(int n) {
return [n](int x) { return x + n; };
}
auto add5 = makeAdder(5);
std::cout << add5(10); // 15Funkcje wyższego rzędu
Lambdy sprawiają, że C++ dobrze nadaje się do używania funkcji wyższego rzędu — funkcji, które przyjmują lub zwracają inne funkcje.
Szybkie sprawdzenie
Co oznacza auto na liście parametrów lambdy w C++14?
Podsumowanie
Generyczne lambdy C++14 używają parametrów auto do polimorfizmu w czasie kompilacji. Każda lambda ma unikatowy typ domknięcia — do jej przechowywania należy użyć auto, a std::function wtedy, gdy potrzebne jest wymazywanie typu.
Często zadawane pytania
Czy lekcja „Generyczne lambdy i domknięcia w C++14” jest bezpłatna?
Tak — pełny tekst „Generyczne lambdy i domknięcia w C++14” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Generyczne lambdy i domknięcia w C++14”?
Pisz generyczne lambdy z parametrami auto i analizuj typy domknięć Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Generyczne lambdy i domknięcia w C++14”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Obiekty funkcyjne i funktory
- Przechwytywanie w lambdach: przez wartość, referencję, mutable
- Generyczne lambdy i domknięcia w C++14
- std::function — wywoływalne obiekty z wymazywaniem typu