C++ Academy · Oppitunti

std::function

Tallenna mikä tahansa kutsuttava olio

Oppitunti 2/413 vaihetta

std::function on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mikä on std::function?

std::function on tyyppinsä häivyttävä kääre, joka voi sisältää minkä tahansa kutsuttavan olion, joka vastaa annettua allekirjoitusta: vapaita funktioita, lambdoja, funktoreita tai sidottuja lausekkeita.

  • Se määritellään kohteen allekirjoituksen avulla.
  • Se sijaitsee <functional>-kirjastossa.
#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;
}

Lambdan tallentaminen

Toisin kuin paljas funktio-osoitin, std::function tallentaa vaivatta lambdan, myös kaappauksia sisältävän.

#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;
}

Funktorin tallentaminen

Funktori on olio, jolla on operator(). std::function voi kääriä funktorin ja kutsua sen operaattoria, kun oliota kutsutaan.

#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;
}

Kohteen vaihtaminen

Yksi std::function-muuttuja voi osoittaa elinkaarensa aikana eri kutsuttaviin olioihin. Tämä on hyödyllistä, kun toiminnallisuutta vaihdetaan ajon aikana.

#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;
}

Tyhjä std::function

Oletusarvoisesti rakennettu std::function ei sisällä mitään. Sen kutsuminen heittää poikkeuksen std::bad_function_call, joten tarkistakaa se ensin.

#include <iostream>
#include <functional>

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

Parametrina

Funktiot voivat ottaa std::function-parametrin ja hyväksyä minkä tahansa vastaavan kutsuttavan olion, mikä tekee rajapinnoista joustavia.

#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;
}

Takaisinkutsujen tallentaminen

Yksi yleinen käyttötapa on säilyttää takaisinkutsu luokan jäsenenä, jotta se voidaan kutsua myöhemmin tapahtuman sattuessa.

#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;
}

Kutsuttavien olioiden vektori

Koska niillä on sama tyyppi, erilaiset kutsuttavat oliot voivat olla yhdessä säiliössä ja ne voidaan kutsua vuorotellen.

#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;
}

Tyypin häivytyksen hinta

std::function saattaa varata muistia ja lisää epäsuoran kutsun, joten se on hieman hitaampi kuin suora kutsu tai mallipohjainen kutsuttava olio. Käyttäkää sitä, kun tarvitsette yhtenäistä tallennustapaa.

#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;
}

std::function-arvon palauttaminen

Tehdasfunktio voi rakentaa ja palauttaa määritetyn kutsuttavan olion, jolloin kutsujat saavat käyttöönsä mukautettua toiminnallisuutta.

#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;
}

Vertailu funktio-osoittimiin

std::function on funktio-osoitinta joustavampi, koska se voi sisältää tilaa, mutta joustavuus maksaa hieman suorituskyvyssä ja saattaa aiheuttaa muistivarauksen.

#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;
}

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte std::function-tyyppiä.

Kertaus

Opitte, että std::function:

  • käärii minkä tahansa allekirjoitustaan vastaavan kutsuttavan olion, myös tilalliset lambdat ja funktorit
  • voidaan määrittää uudelleen, tallentaa säiliöihin ja palauttaa tehdasfunktioista
  • heittää bad_function_call-poikkeuksen ollessaan tyhjä
  • aiheuttaa hieman lisäkustannuksia tyypin häivytyksen vuoksi

Seuraavaksi käytätte std::bind-toimintoa kutsuttavien olioiden argumenttien esitäyttöön.

Aloita maksutta

Opi C++ tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”std::function” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “std::function”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”std::function”?

Tallenna mikä tahansa kutsuttava olio Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”std::function”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?

Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Funktio-osoittimet
  2. std::function
  3. std::bind
  4. Kutsuttavien olioiden valinta
← Takaisin: C++ Academy