std::function ile Türü Silinmiş Çağrılabilirler
Türleri std::function arkasında gizleyin ve küçük arabellek iyileştirmesini anlayın
std::function ile Türü Silinmiş Çağrılabilirler, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.
Sorun: Birçok Çağrılabilir İçin Tek Tür
Her lambda'nın türü benzersizdir. Her işlev göstericisi farklı bir türdür. Bunlardan herhangi birini tutabilecek tek bir türe ihtiyacımız vardır: std::function.
Şablon Parametresi
std::function<Signature>, dönüş türünü ve parametre türlerini alır. Bu imzayla çağrılabilen her şeyi kabul eder.
#include <functional>
std::function<int(int, int)> op;
op = [](int a, int b) { return a + b; };
std::cout << op(3, 4); // 7Farklı Çağrılabilirleri Saklama
Aynı std::function değişkeni, imza eşleştiği sürece lambda, işlev göstericisi veya işlev nesnesi tutabilir.
std::function<int(int)> f;
f = [](int x) { return x * 2; }; // lambda
f = ::abs; // function pointer
f = std::negate<int>{}; // functorTür Silme
Dahili olarak std::function tür silme kullanır; her çağrılabilir nesneyi saklar ve gerçek türünü tek biçimli bir arayüzün arkasında gizler. Bu işlem çoğu zaman küçük bir yığın belleği ayırmayla uygulanır.
Başarım Bedeli
std::function üzerinden çağrı yapmak, dolaylı bir çağrı içerir (sanal işleve benzer). Doğrudan lambda çağrısından daha yavaştır. Yoğun yürütme yollarında kullanmaktan kaçının.
std::function Ne Zaman Kullanılmalı?
Şu durumlarda kullanın:
- Geri çağrıları bir kapsayıcıda veya sınıf üyesinde saklarken
- Bir işlevden çağrılabilir bir nesne döndürürken
- Bir eklenti veya olay sistemi oluştururken
Boş std::function
Varsayılan oluşturulmuş bir std::function boştur. Onu çağırmak std::bad_function_call fırlatır.
std::function<void()> f;
if (f) f(); else std::cout << "no callback set";Üye İşlev Göstericileri
Bir üye işlevini std::bind ile bağlayın veya bir lambda içine sarın.
struct Obj { void greet(int) {} };
Obj o;
std::function<void(int)> cb = [&](int n) { o.greet(n); };İşlev Göstericileriyle Karşılaştırma
İşlev göstericileri durum saklayamaz. std::function saklayabilir; bunun bedeli dolaylı çağrılardır.
Şablonlarla Karşılaştırma
Çağrılabilir parametrelere sahip şablonlar derleme zamanında özelleştirilir ve en hızlı seçenektir. std::function çalışma zamanında çözümlenir; daha yavaştır, ancak esnektir.
template <typename F>
void run(F f) { f(); } // compile-time, no overhead
void run(std::function<void()> f) { f(); } // runtime, type erasureC++23'te std::function: std::function_ref
C++23, çağrılabilir bir nesnenin sahiplik içermeyen görünümü olan std::function_ref'i ekledi. Ömür sınırlı olduğunda yığın belleği ayırma ihtiyacını ortadan kaldırır.
Alternatifler
Daha hafif alternatifler vardır: std::move_only_function (C++23), tl::function_ref ve folly::Function. İhtiyaçlarınıza göre seçim yapın.
Hızlı Kontrol
std::function'ın temel dezavantajı nedir?
Özet
std::function<Signature>, imzası eşleşen herhangi bir çağrılabilir nesneyi saklar. Geri çağrılar, eklentiler ve çağrılabilirler üzerinde çalışma zamanı çok biçimliliği için kullanışlıdır; bunun bedeli dolaylı çağrılardır.
Sıkça Sorulan Sorular
“std::function ile Türü Silinmiş Çağrılabilirler” dersi ücretsiz mi?
Evet — “std::function ile Türü Silinmiş Çağrılabilirler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.
“std::function ile Türü Silinmiş Çağrılabilirler” dersinde ne öğreneceğim?
Türleri std::function arkasında gizleyin ve küçük arabellek iyileştirmesini anlayın C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C++ Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“std::function ile Türü Silinmiş Çağrılabilirler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- İşlev Nesneleri ve İşlev Nesnesi Sınıfları
- Lambda Yakalamaları: Değerle, Referansla, mutable
- Genel Lambda'lar ve Kapanışlar C++14
- std::function ile Türü Silinmiş Çağrılabilirler