c++ - ¿Cuál es el punto de saber si un objeto es una integral o no o es un tipo de clase o no?
templates (2)
Es para meta programación de plantillas. Cuando no tenga idea de qué tipo (s) el usuario final pasará a la plantilla. A veces es para informar errores, a veces es para especializarse en los tipos pasados. A veces es una combinación.
Los ejemplos vistos en cppreference.com (por ejemplo, https://en.cppreference.com/w/cpp/types/is_enum ) están muy simplificados y solo muestran cómo usar el rasgo de una manera no típica. Casi nunca usaría estos rasgos directamente en una simple (función o clase sin plantilla).
Hola, he visto muchos ejemplos como este en Cppreference.com:
std::is_class<T>
std::is_integral
Y así.
Sé que si ejecuto el código, por ejemplo, obtengo
true
o
false
.
¿Pero cuál es el punto en eso?
por ejemplo, ¿saber que el objeto es de clase 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'';
}
La salida:
true
true
false
false
-
He buscado por todas partes un ejemplo real usando esto (
is_class
,is_integral
,is_arithmetic
, ...) Pero todos los tutoriales muestran solo el ejemplo desesperado: solotrue
ofalse
. -
¿Alguien podría ayudarme con un pequeño ejemplo útil usando estas plantillas?
No es para escribir en la consola, eso es seguro.
En términos más generales, se pregunta: ¿cuál es el punto de los rasgos de tipo?
La respuesta es la metaprogramación de plantilla . Por ejemplo, puedo crear una especialización de plantilla que hace una cosa para los tipos integrales y otra para los tipos no integrales.
Aaron Bullman tiene una introducción simple a los rasgos tipográficos, al igual que Jacek here .
En mi opinión, la mayoría del uso de estas cosas se encontrará oculto en implementaciones de características geniales y clases y utilidades (es decir, en bibliotecas) como parte de la maquinaria de fondo que hace que todo funcione.
Otras lecturas:
- Rasgos tipo C ++
- ¿Cómo funcionan las clases de rasgos y qué hacen?
La respuesta de rightfold en la primera da un excelente ejemplo de cuándo los rasgos son útiles:
Por ejemplo, una implementación de
std::copy
puede usarstd::memcpy
internamente en lugar de un bucle explícito cuando los iteradores son punteros a los POD. Esto se puede lograr con SFINAE.