std::function : objets appelables à types effacés
Masquer les types derrière std::function et comprendre l’optimisation des petits tampons
std::function : objets appelables à types effacés est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.
Le problème : un type pour plusieurs éléments appelables
Chaque lambda possède un type unique. Chaque pointeur de fonction est d’un type différent. Nous avons besoin d’un type capable de contenir n’importe lequel d’entre eux — std::function.
Paramètre de modèle
std::function<Signature> prend le type de retour et les types des paramètres. Il accepte tout élément appelable avec cette signature.
#include <functional>
std::function<int(int, int)> op;
op = [](int a, int b) { return a + b; };
std::cout << op(3, 4); // 7Stocker différents éléments appelables
La même variable std::function peut contenir une lambda, un pointeur de fonction ou un objet fonctionnel — à condition que la signature corresponde.
std::function<int(int)> f;
f = [](int x) { return x * 2; }; // lambda
f = ::abs; // function pointer
f = std::negate<int>{}; // functorEffacement de type
En interne, std::function utilise l’effacement de type — il stocke n’importe quel élément appelable et masque son type réel derrière une interface uniforme. Son implémentation utilise souvent une petite allocation sur le tas.
Coût en performance
Un appel via std::function implique un appel indirect (semblable à celui d’une fonction virtuelle). Il est plus lent qu’un appel direct de lambda. Évitez-le dans les chemins critiques.
Quand utiliser std::function
Utilisez-le lorsque :
- Vous stockez des fonctions de rappel dans un conteneur ou comme membre d’une classe
- Vous renvoyez un élément appelable depuis une fonction
- Vous créez un module d’extension ou un système d’événements
std::function vide
Un std::function construit par défaut est vide. Son appel lève une exception std::bad_function_call.
std::function<void()> f;
if (f) f(); else std::cout << "no callback set";Pointeurs vers des méthodes membres
Liez une méthode membre avec std::bind ou encapsulez-la dans une lambda.
struct Obj { void greet(int) {} };
Obj o;
std::function<void(int)> cb = [&](int n) { o.greet(n); };Comparaison avec les pointeurs de fonction
Les pointeurs de fonction ne peuvent pas stocker d’état. std::function le peut — au prix d’appels indirects.
Comparaison avec les modèles
Les modèles dotés de paramètres appelables sont spécialisés à la compilation — ils sont plus rapides. std::function effectue la résolution à l’exécution — il est plus lent, mais flexible.
template <typename F>
void run(F f) { f(); } // compile-time, no overhead
void run(std::function<void()> f) { f(); } // runtime, type erasurestd::function en C++23 : std::function_ref
C++23 a ajouté std::function_ref — une vue non propriétaire d’un élément appelable. Elle évite l’allocation sur le tas lorsque la durée de vie est limitée.
Alternatives
Il existe des alternatives légères : std::move_only_function (C++23), tl::function_ref, folly::Function. Choisissez en fonction de vos besoins.
Vérification rapide
Quel est le principal inconvénient de std::function ?
Récapitulatif
std::function<Signature> stocke tout élément appelable dont la signature correspond. Il est utile pour les fonctions de rappel, les modules d’extension et le polymorphisme à l’exécution des éléments appelables — au prix d’appels indirects.
Questions Fréquemment Posées
La leçon « std::function : objets appelables à types effacés » est-elle gratuite ?
Oui — le texte complet de « std::function : objets appelables à types effacés » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « std::function : objets appelables à types effacés » ?
Masquer les types derrière std::function et comprendre l’optimisation des petits tampons Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C++ Academy ?
Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « std::function : objets appelables à types effacés » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?
Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Objets fonction et foncteurs
- Captures de lambda par valeur, par référence et mutable
- Lambdas génériques et fermetures en C++14
- std::function : objets appelables à types effacés