Parameter pack
- C++ kursu
- İleri seviye
- Ders 8/83
- 5 dk
Parameter pack ve açma (expansion) öğrenirsin.
Parameter pack
Parameter pack, sıfır veya daha fazla değeri tek bir isimle tutan yapıdır. Tür pack'i typename... Args, değer pack'i Args... args biçiminde yazılır. Pack, derleme zamanında açılır; her öğe için ayrı kod üretilir.
Örnek: template <typename... Args> void f(Args... args) herhangi sayıda bağımsız değişken alır. f(1, 2.0, 'x') çağrısı Args = {int, double, char} ve args = {1, 2.0, 'x'} oluşturur. Pack, fonksiyon gövdesinde açılarak işlenir.
Pack'in açılımı
Bir pack fonksiyon gövdesinde kullanıldığında otomatik olarak açılır. sizeof...(args) pack'teki değer sayısını verir. Pack'i tek tek işlemek için fold expression veya özyinelemeli (recursive) şablon kullanılır.
Özyinelemeli yaklaşım: bir fonksiyon ilk bağımsız değişkeni alır, kalan pack'i tekrar kendine geçirir. Boş pack için bir aşırı yükleme (overload) taban durum olur. Bu klasik yöntem C++17'den önce yaygındı; fold expression ile artık daha kısa yazılır.
Uygulama count_args fonksiyonu
template <typename... Args> int count_args(Args... args) yaz. Gövdede return sizeof...(Args); olsun. main içinde count_args(1, 2.0, "x") çağır ve sonucu std::cout ile yazdır.
Başlangıç kodu
#include <iostream>
// count_args şablonunu yaz
int main() {
// count_args(1, 2.0, "x") çağır ve yazdır
return 0;
}Örnek çözüm
#include <iostream>
template <typename... Args>
int count_args(Args... args) {
return sizeof...(Args);
}
int main() {
std::cout << count_args(1, 2.0, "x");
return 0;
}Beklenen çıktı
3
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Değer pack'i tamamla
template <typename... Args>
void f(____) { }
template <typename... Args>
void f(Args... args) { }
Açıklama: Args... args, değer pack'i belirtir.
2 sizeof...(args) ne döndürür?
template <typename... Args>
void f(Args... args) { return sizeof...(args); }- Pack'teki değer sayısını Doğru cevap
- Pack'in ilk türünü
- Tür sayısını değil, byte sayısını
- İlk değerin adresini
Açıklama: sizeof...(args) pack'teki değer sayısını verir.
3 İfadeyi amacına eşle
| Kavram | Anlamı |
|---|---|
typename... Args |
Tür pack tanımı |
Args... args |
Değer pack tanımı |
sizeof...(args) |
Değer sayısı |
sizeof...(Args) |
Tür sayısı |