0Pricing
C++ Academy · Ders

std::function

Herhangi bir çağrılabilir öğeyi depolayın

std::function, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 2. 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.

std::function Nedir?

std::function, belirli bir imzayla eşleşen her çağrılabilir nesneyi (serbest işlevleri, lambda ifadelerini, işlev nesnelerini veya bağlanmış ifadeleri) tutabilen, türü silinmiş bir sarmalayıcıdır.

  • Hedef imzayla bildirilir.
  • <functional> içinde bulunur.
#include <iostream>
#include <functional>

int add(int a, int b) { return a + b; }

int main() {
    std::function<int(int, int)> f = add;
    std::cout << f(2, 3) << '\n';
    return 0;
}

Bir Lambda İfadesini Saklama

Ham bir işlev işaretçisinin aksine, std::function yakalamalar içeren bir lambda ifadesini bile sorunsuzca saklar.

#include <iostream>
#include <functional>

int main() {
    int offset = 10;
    std::function<int(int)> f = [offset](int x) { return x + offset; };
    std::cout << f(5) << '\n';
    return 0;
}

Bir İşlev Nesnesini Saklama

İşlev nesnesi, operator() içeren bir nesnedir. std::function böyle bir nesneyi sarmalayabilir ve çağrıldığında işleçini çalıştırabilir.

#include <iostream>
#include <functional>

struct Multiplier {
    int factor;
    int operator()(int x) const { return x * factor; }
};

int main() {
    std::function<int(int)> f = Multiplier{3};
    std::cout << f(4) << '\n';
    return 0;
}

Hedefi Yeniden Atama

Bir std::function değişkeni, yaşam süresi boyunca farklı çağrılabilir nesnelere işaret edebilir; bu, çalışma zamanında davranışı değiştirmek için kullanışlıdır.

#include <iostream>
#include <functional>

int main() {
    std::function<int(int)> f = [](int x) { return x + 1; };
    std::cout << f(10) << '\n';
    f = [](int x) { return x * x; };
    std::cout << f(10) << '\n';
    return 0;
}

Boş std::function

Varsayılan oluşturulan bir std::function hiçbir şey içermez. Onu çağırmak std::bad_function_call fırlatır; bu nedenle önce kontrol edin.

#include <iostream>
#include <functional>

int main() {
    std::function<void()> f;
    if (f) {
        f();
    } else {
        std::cout << "empty\n";
    }
    return 0;
}

Parametre Olarak

İşlevler, eşleşen herhangi bir çağrılabilir nesneyi kabul etmek için std::function parametresi alabilir; bu da uygulama arayüzlerini esnek hâle getirir.

#include <iostream>
#include <functional>

void repeat(int n, const std::function<void(int)>& action) {
    for (int i = 0; i < n; ++i) action(i);
}

int main() {
    repeat(3, [](int i) { std::cout << "step " << i << '\n'; });
    return 0;
}

Geri Çağrıları Saklama

Yaygın bir kullanım, bir olay gerçekleştiğinde daha sonra çağrılabilmesi için bir geri çağrıyı bir sınıf üyesinde tutmaktır.

#include <iostream>
#include <functional>

struct Button {
    std::function<void()> onClick;
    void click() { if (onClick) onClick(); }
};

int main() {
    Button b;
    b.onClick = [] { std::cout << "clicked!\n"; };
    b.click();
    return 0;
}

Çağrılabilir Nesnelerden Oluşan Bir Vektör

Aynı türü paylaştıkları için farklı çağrılabilir nesneler bir kapsayıcıda birlikte bulunabilir ve sırayla çağrılabilir.

#include <iostream>
#include <functional>
#include <vector>

int inc(int x) { return x + 1; }

int main() {
    std::vector<std::function<int(int)>> ops;
    ops.push_back(inc);
    ops.push_back([](int x) { return x * 2; });
    for (auto& op : ops) std::cout << op(10) << ' ';
    std::cout << '\n';
    return 0;
}

Tür Silmenin Maliyeti

std::function bellek ayırabilir ve dolaylı bir çağrı ekleyebilir; bu nedenle doğrudan bir çağrıdan veya şablonla oluşturulmuş bir çağrılabilir nesneden biraz daha yavaştır. Tek tip depolamaya ihtiyaç duyduğunuzda kullanın.

#include <iostream>
#include <functional>

int main() {
    std::function<int()> f = [] { return 42; };
    int total = 0;
    for (int i = 0; i < 5; ++i) total += f();
    std::cout << total << '\n';
    return 0;
}

Bir std::function Döndürme

Bir üretici, yapılandırılmış bir çağrılabilir nesne oluşturup döndürebilir; böylece çağıranlar özelleştirilmiş davranış elde edebilir.

#include <iostream>
#include <functional>

std::function<int(int)> adder(int n) {
    return [n](int x) { return x + n; };
}

int main() {
    auto add5 = adder(5);
    std::cout << add5(10) << '\n';
    return 0;
}

İşlev İşaretçileriyle Karşılaştırma

std::function, durum sakladığı için bir işlev işaretçisinden daha esnektir; ancak bu esneklik biraz başarım maliyeti ve olası bir bellek ayırma işlemi getirir.

#include <iostream>
#include <functional>

int main() {
    int base = 7;
    std::function<int(int)> stateful = [base](int x) { return x + base; };
    std::cout << "Stateful result: " << stateful(3) << '\n';
    return 0;
}

Kısa Kontrol

std::function hakkındaki anlayışınızı sınayın.

Özet

std::function hakkında şunları öğrendiniz:

  • Durum taşıyan lambda ifadeleri ve işlev nesneleri de dâhil olmak üzere imzasıyla eşleşen her çağrılabilir nesneyi sarmalar
  • Yeniden atanabilir, kapsayıcılarda saklanabilir ve üreticilerden döndürülebilir
  • Boş olduğunda bad_function_call fırlatır
  • Tür silmeden kaynaklanan küçük bir ek yüke sahiptir

Sırada, çağrılabilir nesnelerin bağımsız değişkenlerini önceden doldurmak için std::bind kullanacaksınız.

Sıkça Sorulan Sorular

“std::function” dersi ücretsiz mi?

Evet — “std::function” 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” dersinde ne öğreneceğim?

Herhangi bir çağrılabilir öğeyi depolayı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 2. dersidir.

“std::function” 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

  1. İşlev İşaretçileri
  2. std::function
  3. std::bind
  4. Çağrılabilir Ögeleri Seçme
← C++ Academy Sayfasına Dön