CodeBlanks Logo Icon CodeBlanks

Fold expressions

C++17 fold expressions ile paket işleme öğrenirsin.

Fold expressions

Fold expression (C++17), bir parameter pack'i tek bir işleçle özetler. Sağ fold: (args + ...). Sol fold: (... + args). Pack'in her öğesi işlecin sol ve sağ tarafına yerleştirilir.

Örnek: (args + ...), args = {1, 2, 3, 4} için 1 + (2 + (3 + 4)) hesaplar; sonuç 10. Fold, özyinelemeli şablon yazmaktan çok daha kısadır. Pack boşsa derleme hatası alınır; bu durumda başlangıç değeri (init) gereklidir.

Başlangıç değerli fold

Pack boşsa fold derleme hatası verir. Bu durumu önlemek için başlangıç değeri (init) kullanılır: (args + ... + 0). Pack boş olsa bile sonuç 0 olur. Bu, özellikle toplam veya çarpım hesaplayan şablonlarda yararlıdır.

Örnek: sum_all() çağrısı boş pack için 0 döndürmelidir. (args + ... + 0) bunu garanti eder. Çarpım için (args * ... * 1) yazılır; boş pack 1 verir. Mantıksal VE için (args && ...) kullanılır.

Uygulama sum_all fold ile

template <typename... Args> auto sum_all(Args... args) yaz. Gövdede return (args + ...); olsun. main içinde sum_all(1, 2, 3, 4) çağır ve sonucu std::cout ile yazdır.

Başlangıç kodu

main.cpp
#include <iostream>

// sum_all şablonunu fold ile yaz

int main() {
    // sum_all(1, 2, 3, 4) çağır ve yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>

template <typename... Args>
auto sum_all(Args... args) {
    return (args + ...);
}

int main() {
    std::cout << sum_all(1, 2, 3, 4);
    return 0;
}

Beklenen çıktı

10

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 (args + ...) hangi fold türüdür?

  • Sol fold
  • İkili fold
  • Sağ fold Doğru cevap
  • Çapraz fold

Açıklama: (args + ...) sağ fold'tür; pack sağındadır.

2 Fold türünü eşle

Kavram Anlamı
(args + ...) Sağ fold
(... + args) Sol fold
(args + ... + 0) Sağ fold, başlangıç değerli
(... + args + 0) Sol fold, başlangıç değerli

3 Fold ifadesini tamamla

Soru
template <typename... Args>
auto sum_all(Args... args) {
    return (args + ____);
}
Cevap
template <typename... Args>
auto sum_all(Args... args) {
    return (args + ...);
}

Açıklama: (args + ...) sağ fold'tür.

İleri seviye bölümündeki tüm dersler