Fold expressions
- C++ kursu
- İleri seviye
- Ders 9/83
- 5 dk
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
#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
#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
template <typename... Args>
auto sum_all(Args... args) {
return (args + ____);
}
template <typename... Args>
auto sum_all(Args... args) {
return (args + ...);
}
Açıklama: (args + ...) sağ fold'tür.