C++ Academy · Lezione

Scrivere trait personalizzati

Creare i propri trait di tipo

Lezione 4 di 413 passaggi

Scrivere trait personalizzati è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 4 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.

Creare i propri trait

Quando la libreria standard non offre la verifica necessaria, è possibile scrivere un trait personalizzato. Un trait è semplicemente un template che espone ::value o ::type.

Template primario + specializzazione

Il modello standard prevede un template primario con valore predefinito false e una specializzazione che corrisponde al tipo di interesse e imposta true.

#include <iostream>
#include <type_traits>

template <typename T>
struct is_ptr : std::false_type {};

template <typename T>
struct is_ptr<T*> : std::true_type {};

int main() {
    std::cout << is_ptr<int>::value << "\n";
    std::cout << is_ptr<int*>::value << "\n";
    return 0;
}

Ereditare da integral_constant

Ereditando da std::true_type o std::false_type, il trait ottiene automaticamente un membro value e si comporta come i trait standard.

Un rilevatore di container

Rilevi se un tipo ha le caratteristiche di un container verificando la presenza di membri annidati. Qui specializziamo in base alla presenza di un typedef value_type tramite un helper.

#include <iostream>
#include <vector>
#include <type_traits>

template <typename T, typename = void>
struct has_value_type : std::false_type {};

template <typename T>
struct has_value_type<T, std::void_t<typename T::value_type>> : std::true_type {};

int main() {
    std::cout << has_value_type<std::vector<int>>::value << "\n";
    std::cout << has_value_type<int>::value << "\n";
    return 0;
}

Spiegazione di std::void_t

std::void_t<...> converte qualsiasi elenco di tipi valido in void. Se uno dei tipi contenuti non è valido, la specializzazione viene eliminata tramite SFINAE, quindi prevale il false_type primario.

Rilevare una funzione membro

È possibile rilevare se un tipo dispone di un size() richiamabile verificando l'espressione in un void_t.

#include <iostream>
#include <string>
#include <type_traits>

template <typename T, typename = void>
struct has_size : std::false_type {};

template <typename T>
struct has_size<T, std::void_t<decltype(std::declval<T>().size())>> : std::true_type {};

int main() {
    std::cout << has_size<std::string>::value << "\n";
    std::cout << has_size<int>::value << "\n";
    return 0;
}

declval

std::declval<T>() produce un valore fittizio di tipo T nei contesti non valutati, consentendo di scrivere espressioni decltype senza costruire un oggetto.

Un trait di trasformazione

I trait personalizzati possono anche produrre tipi. Questo rimuove un livello di puntatore.

#include <iostream>
#include <type_traits>

template <typename T>
struct remove_one_pointer { using type = T; };

template <typename T>
struct remove_one_pointer<T*> { using type = T; };

int main() {
    using R = remove_one_pointer<int*>::type;
    std::cout << std::is_same_v<R, int> << "\n";
    return 0;
}

Fornire gli helper _v e _t

Segua lo stile della libreria standard aggiungendo template di variabili e alias.

#include <iostream>
#include <type_traits>

template <typename T>
struct is_char : std::false_type {};
template <>
struct is_char<char> : std::true_type {};

template <typename T>
inline constexpr bool is_char_v = is_char<T>::value;

int main() {
    std::cout << is_char_v<char> << "\n";
    std::cout << is_char_v<int> << "\n";
    return 0;
}

Detection idiom

La tecnica void_t si generalizza nella detection idiom, formalizzata da std::is_detected sperimentale. I concepts di C++20 rendono gran parte di questo meccanismo più semplice.

Testare i propri trait

Verifichi i trait personalizzati con static_assert, in modo che ogni regressione interrompa immediatamente la compilazione.

#include <type_traits>

template <typename T>
struct is_void_like : std::false_type {};
template <>
struct is_void_like<void> : std::true_type {};

static_assert(is_void_like<void>::value);
static_assert(!is_void_like<int>::value);

int main() { return 0; }

Verifica rapida

Richiami il ruolo di std::void_t.

Riepilogo

Ha imparato a scrivere trait personalizzati.

  • Il template primario ha false come valore predefinito; la specializzazione imposta true
  • Erediti da true_type/false_type
  • void_t + declval costituiscono la detection idiom
  • Aggiunga gli helper _v/_t e verifichi con static_assert
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 «Scrivere trait personalizzati» è gratuita?

Sì — il testo completo di «Scrivere trait personalizzati» è 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 «Scrivere trait personalizzati»?

Creare i propri trait di tipo 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 4 di 4.

Quanto tempo richiede la lezione «Scrivere trait personalizzati»?

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. Interrogare i tipi
  2. Trasformare i tipi
  3. Logica condizionale
  4. Scrivere trait personalizzati
← Torna a C++ Academy