std::function
- C++ kursu
- Orta seviye
- Ders 80/116
- 5 dk
std::function ile lambda saklamayı öğrenirsin.
std::function
std::function bir lambda'yı (veya başka çağrılabilir nesneyi) saklayan genel bir türdür. <functional> başlığında tanımlıdır. Örnek: std::function<int(int)> f = [](int x) { return x * x; };. Burada int(int) bir int alıp int döndüren fonksiyon türüdür.
auto ile lambda saklamak daha kolaydır ama std::function'ın avantajı, lambda türünün derleyici tarafından bilinmesine gerek olmamasıdır. Bu, lambda'yı bir fonksiyon parametresi olarak geçirmeyi veya bir vector'de saklamayı kolaylaştırır. Bu tekniğe type erasure (tür silme) denir. std::function biraz daha yavaştır çünkü çağrıyı dolaylı yapar; ama esneklik genellikle bu maliyete değer.
Type erasure
Her lambda'nın benzersiz bir türü vardır; derleyici tarafından üretilir ve adı yoktur. Bu yüzden iki lambda'nın türü aynı olsa bile birbirine atanamaz. std::function bu sorunu çözer: farklı lambda türlerini tek bir std::function türünde saklar.
Örnek: std::function<int(int)> f1 = [](int x) { return x + 1; }; ve std::function<int(int)> f2 = [](int x) { return x * 2; }; aynı std::function türündedir. Bu sayede bir std::vector<std::function<int(int)>> içinde farklı lambdaları saklayabilirsin. Bu, olay işleme (event handling) ve geri çağrı (callback) tasarımlarında çok kullanışlıdır.
Uygulama Lambda'yı std::function'da sakla
std::function<int(int)> square = [](int x) { return x * x; }; ile bir lambda'yı std::function'da sakla. square(6) çağrısının sonucunu std::cout ile yazdır. #include <functional> gerektiğini unutma.
Başlangıç kodu
#include <iostream>
#include <functional>
int main() {
// kare alan lambda'yı bir function nesnesinde sakla ve çağır
return 0;
}Örnek çözüm
#include <iostream>
#include <functional>
int main() {
std::function<int(int)> square = [](int x) { return x * x; };
std::cout << square(6);
return 0;
}Beklenen çıktı
36
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Parçayı rolüne eşle
| Kavram | Anlamı |
|---|---|
std::function<int(int)> |
Lambda türü |
<functional> |
Gerekli başlık |
int(int) |
int alır int döndürür |
f(5) |
Saklanan lambda'yı çağırır |
2 std::function ne sağlar?
std::function<int(int)> f = [](int x) { return x; };- Daha hızlı çalışma
- Lambda'yı bir nesnede saklama Doğru cevap
- Otomatik capture
- Derleme hatası gizleme
Açıklama: std::function lambda'yı bir nesnede saklar.
3 std::function tanımla
std::____<int(int)> square = [](int x) { return x * x; };
std::function<int(int)> square = [](int x) { return x * x; };
Açıklama: std::function lambda saklayan genel türdür.