Funktionsobjekt och funktorer
Skriv klasser med operator() för att skapa anropsbara objekt med tillstånd
Funktionsobjekt och funktorer är en gratis lektion i C++ Academy på CoddyKit. Detta är lektion 1 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för C++ Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C++ Academy innehåller totalt 4 lektioner.
Vad är en funktor?
En funktor (funktionsobjekt) är en klass som överlagrar operator(). Instanser kan anropas som funktioner.
struct Square {
int operator()(int x) const { return x * x; }
};
Square sq;
std::cout << sq(5); // 25Varför inte bara en funktion?
Funktorer har ett tillstånd. En vanlig funktion har inte det. Tillstånd gör konfiguration, räkning och tillståndsberoende återanrop möjliga.
struct Counter {
int count = 0;
int operator()(int x) { ++count; return x; }
};
Counter c;
c(10); c(20); c(30);
std::cout << c.count; // 3Konfigurerbart beteende
Lagra konfigurationen i funktorns medlemmar. Samma funktortyp fungerar med många olika parameteruppsättningar.
struct GreaterThan {
int threshold;
bool operator()(int x) const { return x > threshold; }
};
GreaterThan over10{10};
over10(15); // true
over10(5); // falseAnvända funktorer med STL-algoritmer
STL-algoritmer accepterar allt som kan anropas — funktorer, lambdor och funktionspekare.
std::vector<int> v = {1, 11, 5, 99, 8};
auto it = std::find_if(v.begin(), v.end(), GreaterThan{10});
std::cout << *it; // 11Fördefinierade funktorer i <functional>
Standardbiblioteket tillhandahåller färdiga funktorer: std::plus, std::less, std::equal_to, std::negate med flera.
#include <functional>
std::vector<int> v = {3, 1, 4, 1, 5};
std::sort(v.begin(), v.end(), std::greater<int>{});
// sorted descendingFunktor kontra funktionspekare
Funktorer kan oftast inline-optimeras bättre eftersom deras operator() är ett direkt anrop. Funktionspekare kan vara mer flexibla, men anropas indirekt.
Funktorer som mallparametrar
Många STL-containrar och -algoritmer accepterar en funktor som mallparameter — jämförelseobjekt för mängder, hashfunktioner och allokerare.
std::set<int, std::greater<int>> s = {1, 2, 3};
// s iterates in descending order: 3, 2, 1Lambdor är funktorer
Kompilatorn genererar en unik klass med operator() för varje lambda. Lambdor är syntaktiskt socker ovanpå funktorer.
När bör ni skriva en funktor?
Använd en handskriven funktor när:
- Samma logik används på många ställen (ge den ett namn)
- Den ingår i ert publika API
- Den måste vara kopierings- eller flyttkonstrukterbar med ett specifikt beteende
När bör ni använda en lambda i stället?
För engångsanvändning är en lambda kortare och tydligare. För återanvändbart beteende blir läsbarheten bättre med en namngiven funktor.
Komponerbarhet
Kombinera funktorer med std::bind eller, mer modernt, genom att komponera lambdor. Funktionella bibliotek som Boost tillhandahåller också kombinatorer.
Snabbtest
Vilken är den viktigaste egenskapen hos en funktor jämfört med en vanlig funktion?
Sammanfattning
En funktor är en klass med operator(). Den har ett tillstånd, integreras med STL-algoritmer och utgör grunden för lambdor. Använd namngivna funktorer för återanvändbart beteende och lambdor för engångslogik.
Lär dig C++ med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 51
- Lektioner
- 203
Vanliga frågor
Är lektionen ”Funktionsobjekt och funktorer” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen C++ Academy, inklusive ”Funktionsobjekt och funktorer”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i C++ Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Funktionsobjekt och funktorer”?
Skriv klasser med operator() för att skapa anropsbara objekt med tillstånd Ni övar på C++ Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig C++ Academy?
Du behöver inga förkunskaper. Utbildningen i C++ Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Funktionsobjekt och funktorer”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här C++ Academy-lektionen?
Ja. Varje C++ Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Funktionsobjekt och funktorer
- Lambda-captures: by value, by reference och mutable
- Generiska lambdor och closures i C++14
- std::function: typraderade anropsbara objekt