Définir des concepts avec requires
Définir des concepts personnalisés avec des expressions requires et des contraintes
Définir des concepts avec requires est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 2 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 mot-clé concept
Déclarez un concept avec template <params> concept Name = expression; L’expression doit être un booléen évalué au moment de la compilation.
template <typename T>
concept Integer = std::is_integral_v<T>;Combinaison des caractéristiques de type
Utilisez des opérateurs logiques pour combiner des caractéristiques en un concept.
template <typename T>
concept SignedInteger = std::is_integral_v<T> && std::is_signed_v<T>;L’expression de contrainte
Une forme plus expressive : énumérez les opérations que le type doit prendre en charge.
template <typename T>
concept Addable = requires(T a, T b) {
a + b;
};Contraintes composées
Dans requires, vous pouvez spécifier le type de résultat et des contraintes supplémentaires.
template <typename T>
concept Number = requires(T a, T b) {
{ a + b } -> std::convertible_to<T>;
{ a * b } -> std::convertible_to<T>;
};Contraintes imbriquées
Ajoutez requires dans une expression requires pour introduire des concepts nommés.
template <typename T>
concept Sortable = requires(T t) {
{ t.begin() };
{ t.end() };
requires std::movable<typename T::value_type>;
};Contraintes de type
Vous pouvez exiger qu’un type possède certains types imbriqués ou alias.
template <typename T>
concept HasValueType = requires {
typename T::value_type;
};Utilisation des concepts dans les modèles
Trois syntaxes :
// 1. Replace typename
template <Integer T>
T increment(T x) { return x + 1; }
// 2. requires after template parameters
template <typename T>
requires Integer<T>
T increment(T x) { return x + 1; }
// 3. requires after function signature
template <typename T>
T increment(T x) requires Integer<T> {
return x + 1;
}Concepts et paramètres automatiques
Les modèles de fonction abrégés peuvent également être contraints.
void process(Integer auto x) { std::cout << x; }Contraintes multiples
Combinez les concepts avec && et ||.
template <std::integral T, std::integral U>
requires (sizeof(T) >= sizeof(U))
T promote(U value) { return static_cast<T>(value); }Conventions de nommage
La plupart du code utilise CamelCase pour les concepts. Certaines bibliothèques utilisent les minuscules, comme la bibliothèque standard. Choisissez une convention et tenez-vous-y.
Concepts dans les modèles de classe
Contraignez les modèles de classe de la même manière.
template <std::integral T>
class Counter { T value_; /* ... */ };Concepts réutilisables
Définissez une bibliothèque de petits concepts et composez-les. Les concepts réutilisables rendent les modèles explicites et faciles à maintenir.
Vérification rapide
Quelle syntaxe, à l’intérieur d’une expression requires, vérifie que le résultat de a + b est convertible en T ?
Récapitulatif
Définissez des concepts avec concept Name = expression. Utilisez les expressions requires pour les contraintes fondées sur des opérations, avec des contraintes composées, imbriquées et de type. Combinez les concepts avec && et || pour exprimer des contraintes riches.
Questions Fréquemment Posées
La leçon « Définir des concepts avec requires » est-elle gratuite ?
Oui — le texte complet de « Définir des concepts avec requires » 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 « Définir des concepts avec requires » ?
Définir des concepts personnalisés avec des expressions requires et des contraintes 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 2 sur 4.
Combien de temps prend la leçon « Définir des concepts avec requires » ?
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
- Pourquoi préférer les concepts à SFINAE
- Définir des concepts avec requires
- Utiliser les concepts dans les modèles et avec auto
- Concepts standard courants : integral et Ranges