Szablony wariadyczne i paczki parametrów
Używaj paczek parametrów i wyrażeń fold do pisania szablonów wariadycznych
Szablony wariadyczne i paczki parametrów 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.
Zmienna liczba argumentów szablonu
Szablony wariadyczne przyjmują dowolną liczbę argumentów szablonu. Służą do tworzenia funkcji takich jak std::make_unique, std::tuple oraz logowania w stylu printf.
Składnia pakietu parametrów
Użyj typename... Ts, aby zadeklarować pakiet parametrów typów, oraz Ts..., aby go rozwinąć.
template <typename... Args>
void print_all(Args... args) {
// ...
}Rozwijanie pakietu
Umieszczone po wyrażeniu ... rozwija pakiet do listy elementów rozdzielonych przecinkami.
template <typename... Args>
void pass_through(Args... args) {
other_func(args...); // pass each arg
}Rekurencyjne szablony wariadyczne (starszy styl)
Przed C++17 funkcje wariadyczne zazwyczaj zapisywano rekurencyjnie — przetwarzano jeden argument, a następnie wywoływano rekurencję z pozostałymi.
// base case
void log() {}
// recursive case
template <typename T, typename... Rest>
void log(T first, Rest... rest) {
std::cout << first;
log(rest...);
}Wyrażenia zwijające (C++17)
C++17 wprowadził wyrażenia zwijające, które są znacznie czytelniejsze od rekurencji. Pozwalają zastosować operator do całego pakietu.
template <typename... Args>
auto sum(Args... args) {
return (args + ...); // fold +
}
std::cout << sum(1, 2, 3, 4); // 10Operatory zwijania
Cztery postacie zwijania:
(... op pack)— zwijanie lewostronne z rozwinięciem unarnym(pack op ...)— zwijanie prawostronne(init op ... op pack)— zwijanie lewostronne z wartością początkową(pack op ... op init)— zwijanie prawostronne z wartością początkową
Wypisywanie wszystkich argumentów
Typowy idiom wykorzystujący zwijanie po przecinku.
template <typename... Args>
void print_all(Args... args) {
((std::cout << args << " "), ...); // comma fold
}
print_all(1, "hi", 3.14); // 1 hi 3.14Zliczanie argumentów
sizeof...(pack) zwraca podczas kompilacji liczbę elementów w pakiecie.
template <typename... Args>
void info(Args... args) {
std::cout << "count = " << sizeof...(args);
}Wariadyczne szablony klas
Szablony klas również mogą zawierać pakiety parametrów. Przykład: std::tuple<Ts...>.
template <typename... Ts>
class Tuple {
// implementation uses recursion or storage tricks
};Idealne przekazywanie z pakietami
Połącz szablony wariadyczne z std::forward, aby idealnie przekazywać dowolne argumenty do konstruktora.
template <typename T, typename... Args>
std::unique_ptr<T> my_make_unique(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}Manipulowanie pakietami typów
Za pomocą specjalizacji szablonów lub wyrażeń zwijających można implementować operacje na listach wykonywane podczas kompilacji: pobieranie pierwszego i ostatniego elementu oraz rozkład na głowę i ogon.
Pułapki
Typowe problemy:
- Zapomnienie o rozwinięciu pakietu (
argszamiastargs...) - Kolejność ewaluacji w wyrażeniach zwijających (dla operatorów niełącznych ma znaczenie, czy zwijanie jest lewo- czy prawostronne)
- Wydłużony czas kompilacji przy głębokiej rekurencji
Szybkie sprawdzenie
Jaka funkcja C++17 upraszcza sumowanie wszystkich elementów pakietu parametrów?
Podsumowanie
Szablony wariadyczne obsługują zmienną liczbę argumentów szablonu za pomocą pakietów parametrów. Wyrażenia zwijające z C++17 zastępują rekurencyjny kod wariadyczny zwięzłymi wyrażeniami. W połączeniu z idealnym przekazywaniem stanowią podstawę funkcji fabrykujących i generycznego wyboru implementacji.
Często zadawane pytania
Czy lekcja „Szablony wariadyczne i paczki parametrów” jest bezpłatna?
Tak — pełny tekst „Szablony wariadyczne i paczki parametrów” 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 „Szablony wariadyczne i paczki parametrów”?
Używaj paczek parametrów i wyrażeń fold do pisania szablonów wariadycznych Ć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 „Szablony wariadyczne i paczki parametrów”?
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
- Szablony funkcji i klas — powtórzenie
- Specjalizacja szablonów: częściowa i pełna
- Szablony wariadyczne i paczki parametrów
- Funkcje constexpr i if constexpr