0Pricing
C++ Academy · Lekcja

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);   // 10

Operatory 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.14

Zliczanie 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 (args zamiast args...)
  • 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

  1. Szablony funkcji i klas — powtórzenie
  2. Specjalizacja szablonów: częściowa i pełna
  3. Szablony wariadyczne i paczki parametrów
  4. Funkcje constexpr i if constexpr
← Powrót do C++ Academy