Biblioteca de plantillas estándar de C++ type_traits análisis de código fuente

1. Introducción al código fuente de Type_traits

1. type_traits es una biblioteca base de elementos de plantilla proporcionada por C++11.
2. type_traits se puede calcular en tiempo de compilación. Incluyendo agregar modificación, extracción, consulta de juicio, derivación de tipo y otras funciones.
3. type_traits proporciona verdadero y falso en tiempo de compilación.

Dos, el papel de type_traits

1. Según los diferentes tipos, las plantillas coinciden con diferentes versiones de algoritmos.
Algorithm en STL accede al contenido del contenedor a través de Iterator, y Functor puede ayudar a Algorithm en cambios de estrategia completamente diferentes. Para este cambio, consulte: Un vistazo a la extracción de tipos en la programación de plantillas de C++

2. Compile y verifique las expectativas compuestas del tipo de plantilla
Ejemplo clásico de biblioteca estándar: análisis del constructor de subprocesos de biblioteca estándar de C ++ 11

3. De acuerdo con la variable o tipo pasado por el extremo que llama, extraiga o inserte un nuevo tipo o valor para adaptarse al algoritmo posterior.
Ejemplo:

#include <iostream>
#include <type_traits>

template <typename T>
void fun(T a){
    
    
    if(std::is_same<T,int>::value){
    
    
        std::cout<<"T type is int"<<std::endl;
        //we can do something
    }else{
    
    
        std::cout<<"T type is not int"<<std::endl;
        //we can do other thing
    }
}

3. Análisis del código fuente de type_traits

1. Agregar modificación

std::add_const
std::add_volatile
std::add_cv					//同时添加const和volatile
std::add_lvalue_reference	//添加左值引用&
std::add_rvalue_reference	//添加右值引用&&
std::declval				//添加右值引用&&
std::add_pointer			//先退化左、右值引用,再添加指针*

Ejemplo de uso:

std::add_const<int>::type t = 0;	//t为const int类型
//std::add_const<int>::type t2;	//编译不通过,const定义时需要初始化

2. Extracción

remove_const
remove_volatile
remove_cv
remove_reference			//退化左、右值引用
remove_pointer				
remove_extent				//数组类型,退化一个维度
remove_all_extents			//数组类型,退化所有维度
decay						//退化、衰弱复合运算;const、volatile、reference、extent
autodecltype				//根据值自动推导类型。

1) Para ver el uso detallado de auto y decltype
, consulte: Nuevas características de C++11: auto y decltype

2) type_traits std::decay (decaimiento)
Eliminar referencias y símbolos cv (const y volátil) para tipos ordinarios, las reglas son las siguientes:
Eliminar referencias de tipo T para obtener tipo U, U es remove_reference < T > ::type
if is_array < Si U > ::value es verdadero, el tipo modificado es remove_reference<U>::type*
De lo contrario, si is_function<U>::value es verdadero, el tipo modificado es add_pointer<U>::type
De lo contrario, el el tipo modificado es remove_cv<U>::type

// 例
typedef std::decay<int>::type Normal;    // int
typedef std::decay<int&>::type Ref;    // int
typedef std::decay<int&&>::type RefRef;    // int
typedef std::decay<const int&>::type const;    // int
typedef std::decay<int[2]>::type Array;    // int*
typedef std::decay<int(int)>::type FunPtr;    // int(*)(int) 函数指针

Por lo tanto, usar std::decay puede obtener fácilmente punteros de función.

std::remove_cv<const int>::type t;	//t为int类型
t = 0;
decltype(t) t2 = 1;					//t2为int类型

3. Consulta de juicio
1) La base de implementación es verdadera y falsa en tiempo de compilación:

template<class _Ty,
	_Ty _Val>
	struct integral_constant
	{
    
    	// convenient template for integral constant types
	static constexpr _Ty value = _Val;

	using value_type = _Ty;
	using type = integral_constant;

	constexpr operator value_type() const noexcept
		{
    
    	// return stored value
		return (value);
		}

	_NODISCARD constexpr value_type operator()() const noexcept
		{
    
    	// return stored value
		return (value);
		}
	};
	
template<bool _Val>
	using bool_constant = integral_constant<bool, _Val>;

using true_type = bool_constant<true>;
using false_type = bool_constant<false>;

2) Tipo de juicio

is_void
is_enum
is_integral					//int系列
is_floating_point			//浮点数系列
is_pointer
is_null_pointer				//C++11引入的一种类型,std::nullptr_t
is_arithmetic				//算数类型。int系列、float系列
is_fundamental				//int系列、float系列、void、nullptr_t
is_compound					//化合物。例如:自定义类型、指针。等价!is_function
is_scalar					//C++标准类型
is_union
is_class
is_array
is_object					//不为函数、不为引用、不为void
is_function

Ejemplo de uso:

bool b = std::true_type::value;
b = std::is_lvalue_reference<int> ::value;

3) Sentencia de modificación

is_const
is_volatile
is_lvalue_reference
is_rvalue_reference
is_reference

4) Juicio personalizado de clase

is_polymorphic				//含有虚函数表的类
is_abstract					//抽象的,不可实例化的类
is_final					//禁止重写或继承
is_standard_layout			//标准布局
is_trivial
is_trivially_copyable
is_empty					//空类
is_constructible
is_destructible
is_member_function_pointer
is_member_object_pointer
is_copy_constructible
is_default_constructible
is_move_constructible
is_assignable
is_copy_assignable
is_move_assignable
has_virtual_destructor

Referencia de uso detallada: conocimiento en frío de C++ (2) - optimización del rendimiento del juicio de tipo

5. Cálculos complicados como la derivación de tipos

is_same							//判断两种类型是否相同
is_convertible					//判断两种类型是否可以隐式转换
conditional						//根据一个判断式选择两个类型中的一个,类似三元表达式
enable_if						//判断一个判断式的结果是否为true
extent							//计算数组第N(0开始,默认值)维度元素的个数
rank							//计算数组类型的维度
result_of						//获取可调用对象返回值的类型

Ejemplo de uso:

bool b = std::is_same<int, bool>::value;
b = std::is_convertible<bool, int>::value;
std::conditional<true, int, bool>::type t = 0;		//t为int类型

4. Herramientas de alto nivel de type_traits

El siguiente uso debe ser completamente dominado

ref/cref						//引用的封装,类似智能指针。针对bind和thrad等导致引用失效
invoke							//立即执行可调用对象
function						//将一个可调用对象封装储存,供后续调用
bind							//通用函数适配器
forward							//精准转发

Publicación de blog de referencia:
Aplicación de la palabra clave ref en c ++
Introducción al subproceso de la biblioteca estándar C ++ 11 -> 5. Argumentos de parámetros de subproceso
Objeto invocable de C ++
C ++ 17 std:: invoke ¡
Comprensión profunda de mover y avanzar en C ++!

Referencia de artículo similar: Rasgos y clases de políticas

Si hay errores o deficiencias, ¡bienvenido a comentar y señalar! La creación no es fácil, por favor indique la fuente para la reimpresión. Si es útil, recuerde dar me gusta y seguir (⊙o⊙)
Para obtener más contenido, siga mi blog personal: https://blog.csdn.net/qq_43148810

Supongo que te gusta

Origin blog.csdn.net/qq_43148810/article/details/128833775
Recomendado
Clasificación