C++ Academy · Lezione

Definire concepts con requires

Definisca concepts personalizzati usando espressioni requires e vincoli

Lezione 2 di 414 passaggi

Definire concepts con requires è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

La parola chiave concept

Dichiari un concept con template <params> concept Name = expression; L'espressione deve essere un booleano valutabile al momento della compilazione.

template <typename T>
concept Integer = std::is_integral_v<T>;

Combinare i type trait

Utilizzare gli operatori logici per combinare i trait in un concept.

template <typename T>
concept SignedInteger = std::is_integral_v<T> && std::is_signed_v<T>;

L'espressione requires

Una forma più espressiva: elencare le operazioni che il tipo deve supportare.

template <typename T>
concept Addable = requires(T a, T b) {
    a + b;
};

Requisiti composti

All'interno di requires è possibile specificare il tipo del risultato e ulteriori vincoli.

template <typename T>
concept Number = requires(T a, T b) {
    { a + b } -> std::convertible_to<T>;
    { a * b } -> std::convertible_to<T>;
};

Requisiti annidati

Aggiungere requires all'interno di un'espressione requires per includere concept denominati.

template <typename T>
concept Sortable = requires(T t) {
    { t.begin() };
    { t.end() };
    requires std::movable<typename T::value_type>;
};

Requisiti del tipo

È possibile richiedere che un tipo disponga di determinati tipi o alias annidati.

template <typename T>
concept HasValueType = requires {
    typename T::value_type;
};

Utilizzare i concept nei template

Tre sintassi:

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

Concept e parametri auto

È possibile applicare vincoli anche ai template di funzione con sintassi abbreviata.

void process(Integer auto x) { std::cout << x; }

Vincoli multipli

Combinare i concept con && e ||.

template <std::integral T, std::integral U>
    requires (sizeof(T) >= sizeof(U))
T promote(U value) { return static_cast<T>(value); }

Convenzioni di denominazione

La maggior parte del codice utilizza il CamelCase per i concept. Alcune librerie usano le minuscole, in linea con la libreria standard. Scelga una convenzione e la mantenga.

Concept nei template di classe

Applicare i vincoli ai template di classe nello stesso modo.

template <std::integral T>
class Counter { T value_; /* ... */ };

Concept riutilizzabili

Definire una libreria di piccoli concept e combinarli. I concept riutilizzabili rendono i template autoesplicativi e facili da mantenere.

Verifica rapida

Quale sintassi all'interno di un'espressione requires verifica che il risultato di a + b sia convertibile in T?

Riepilogo

Definire i concept con concept Name = expression. Utilizzare le espressioni requires per i vincoli basati sulle operazioni, con requisiti composti, annidati e relativi ai tipi. Combinare i concept con && e || per esprimere vincoli articolati.

Gratis per iniziare

Impara C++ con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
51
Lezioni
203

Domande Frequenti

La lezione «Definire concepts con requires» è gratuita?

Sì — il testo completo di «Definire concepts con requires» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «Definire concepts con requires»?

Definisca concepts personalizzati usando espressioni requires e vincoli Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Definire concepts con requires»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Perché usare i concepts invece di SFINAE
  2. Definire concepts con requires
  3. Usare i concepts nei template e con auto
  4. Concepts standard comuni: integral e ranges::range
← Torna a C++ Academy