std::function
Tallenna mikä tahansa kutsuttava olio
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.
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.