Qual è il punto nel sapere se un oggetto è un integrale o no o è un tipo di classe o no?


14

Ciao, ho visto molti esempi come questo in Cppreference.com:

std::is_class<T>
std::is_integral

E così via. So se eseguo il codice per esempio ottengo trueo false. Ma che senso ha questo? ad esempio sapere che l'oggetto è di tipo classe o no?

#include <iostream>
#include <type_traits>

struct A {};
class B {};
enum class C {};

int main()
{
    std::cout << std::boolalpha;
    std::cout << std::is_class<A>::value << '\n';
    std::cout << std::is_class<B>::value << '\n';
    std::cout << std::is_class<C>::value << '\n';
    std::cout << std::is_class<int>::value << '\n';
}

Il risultato:

true
true
false
false
  • Ho cercato dappertutto per un esempio reale di utilizzare questo ( is_class, is_integral, is_arithmetic, ...) Ma tutti i tutorial mostrano solo l'esempio senza speranza: solo trueo false.

  • Qualcuno potrebbe aiutarmi con un piccolo esempio utile usando questi modelli?


1
Un semplice esempio - std::copy. E se i tipi fossero std::copy"semplici", come una matrice di into char? Useresti memcpy, vero? Quindi, come si dice "Se il tipo è semplice, utilizzare memcpy, altrimenti utilizzare un ciclo" lento "?
PaulMcKenzie,

Risposte:


17

Non è per scrivere sulla console, questo è certo.

Più in generale, ti stai chiedendo: qual è il punto dei tratti tipografici?

La risposta è la metaprogrammazione del modello . Ad esempio, posso creare una specializzazione modello che fa una cosa per i tipi integrali e un'altra per i tipi non integrali.

Aaron Bullman ha una semplice introduzione ai caratteri tipografici , così come Jacek qui .

A mio avviso, la maggior parte dell'uso di queste cose si troverà sepolto nelle implementazioni di funzioni interessanti e classi e utilità (ad esempio nelle biblioteche) come parte del meccanismo di background che fa funzionare tutto.

Ulteriori letture:

la risposta di rightfold su quella prima fornisce un superbo esempio di quando i tratti sono utili:

Ad esempio, un'implementazione di std::copypuò utilizzare std::memcpyinternamente anziché un ciclo esplicito quando gli iteratori sono puntatori a POD. Ciò può essere ottenuto con SFINAE.


Quindi intendi, ad esempio, che posso usarli per disabilitare alcune istanze di modelli per un tipo specifico, ad esempio è logico disabilitare una funzione Power<T>o una classe basata su modelli quando il tipo di argomento non è integrale, diciamo std :: string?
Rami Yen,

1
@RamiYen, Sì, è indicato come SFINAE .
chris,

7

È per la meta programmazione dei template. Quando non hai idea di quale tipo (i) l'utente finale passerà nel modello. A volte è per segnalare errori, a volte è per specializzarsi sui tipi passati. A volte è una combinazione.

Gli esempi visti su cppreference.com (ad es. Https://en.cppreference.com/w/cpp/types/is_enum ) sono molto più semplificati e mostrano semplicemente come usare il tratto in un modo non tipico. Non useresti quasi mai questi tratti direttamente in una semplice (funzione o classe non modello).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.