Informe técnico de C ++ 1 - C++ Technical Report 1
C ++ Technical Report 1 ( TR1 ) es el nombre común de ISO / IEC TR 19768, Extensiones de biblioteca C ++ , que es un documento que propone adiciones a la biblioteca estándar C ++ para el estándar de lenguaje C ++ 03 . Las adiciones incluyen expresiones regulares , punteros inteligentes , tablas hash y generadores de números aleatorios . TR1 no era una norma en sí misma, sino un borrador de documento. Sin embargo, la mayoría de sus propuestas se convirtieron en parte del estándar oficial posterior, C ++ 11. Antes de que se estandarizara C ++ 11, los proveedores usaban este documento como guía para crear extensiones. El objetivo del informe era "construir una práctica existente más generalizada para una biblioteca estándar C ++ ampliada".
El informe se distribuyó por primera vez en forma de borrador en 2005 como Informe técnico preliminar sobre extensiones de biblioteca C ++ , luego se publicó en 2007 como una norma ISO / IEC como ISO / IEC TR 19768: 2007 .
Visión general
Los compiladores no necesitaban incluir los componentes TR1 para cumplir con el estándar C ++, porque las propuestas de TR1 no formaban parte del estándar en sí, solo un conjunto de posibles adiciones que aún estaban por ratificar. Sin embargo, la mayor parte de TR1 estaba disponible en Boost , y varios distribuidores de compiladores / bibliotecas implementaron todos o algunos de los componentes. TR1 no es la lista completa de adiciones a la biblioteca que apareció en C ++ 11 . Por ejemplo, C ++ 11 incluye una biblioteca de soporte de subprocesos que no está disponible en TR1.
Los nuevos componentes se definieron en el std::tr1
espacio de nombres para distinguirlos de la biblioteca estándar vigente en ese momento.
Componentes
TR1 incluye los siguientes componentes:
Utilidades generales
Envoltorio de referencias : permite pasar referencias , en lugar de copias, a algoritmos u objetos de función. La función se basó en Boost.Ref. Se obtiene una referencia de contenedor de una instancia de la clase de plantilla reference_wrapper
. Las referencias de contenedor son similares a las referencias normales ('&') del lenguaje C ++. Para obtener una referencia contenedora de cualquier objeto ref
se usa la clase de plantilla (para una referencia constante cref
se usa).
Las referencias de contenedor son útiles sobre todo para las funciones de plantilla, cuando la deducción de argumentos no deduciría una referencia (por ejemplo, al reenviar argumentos):
#include <iostream>
#include <tr1/functional>
void f( int &r ) { ++r; }
template< class Funct, class Arg >
void g( Funct f, Arg t )
{
f(t);
}
int main()
{
int i = 0;
g( f, i ); // 'g< void(int &r), int >' is instantiated
std::cout << i << "\n"; // Output: 0
g( f, std::tr1::ref(i) ); // 'g< void(int &r), reference_wrapper<int> >' is instanced
std::cout << i << "\n"; // Output: 1
}
Punteros inteligentes : agrega varias clases que simplifican la administración de la vida útil de los objetos en casos complejos. Se agregan tres clases principales:
-
shared_ptr
- un puntero inteligente contado por referencia -
weak_ptr
- una variante deshared_ptr
eso no aumenta el recuento de referencias
La propuesta se basa en la biblioteca Boost Smart Pointer.
Objetos de función
Estos cuatro módulos se agregan al <functional>
archivo de encabezado:
Envoltorio de función polimórfica ( function
): puede almacenar cualquier función invocable (punteros de función, punteros de función miembro y objetos de función) que utilice una firma de llamada de función especificada. El tipo no depende del tipo de invocable utilizado. Basado en Boost.Function
Vinculadores de objetos de función ( bind
): pueden vincular cualquier parámetro de parámetro a objetos de función. También se permite la composición de funciones. Ésta es una versión generalizada de las funciones estándar std::bind1st
y de std::bind2nd
vinculación. La función se basa en la biblioteca Boost Bind.
Tipos de retorno de función ( result_of
): determina el tipo de expresión de llamada.
Funciones miembro ( mem_fn
): mejora del estándar std::mem_fun
y std::mem_fun_ref
. Permite que los punteros a funciones miembro se traten como objetos de función. Basado en la biblioteca Boost Mem Fn.
Metaprogramación y rasgos tipográficos
En la actualidad existe <type_traits>
fichero de cabecera que contiene muchos rasgos útiles meta-plantillas, como is_pod
, has_virtual_destructor
, remove_extent
, etc. Facilita metaprogramming al permitir que las consultas sobre la transformación y entre diferentes tipos . La propuesta se basa en la biblioteca Boost Type Traits.
Instalaciones numéricas
Generación de números aleatorios
- nuevo
<random>
archivo de cabecera -variate_generator
,mersenne_twister
,poisson_distribution
, etc. - utilidades para generar números aleatorios usando cualquiera de varios generadores de números pseudoaleatorios , motores y distribuciones de probabilidad
Funciones matemáticas especiales
Algunas características de TR1, como las funciones matemáticas especiales y ciertas adiciones de C99, no están incluidas en la implementación de Visual C ++ de TR1. La biblioteca de funciones especiales matemáticas no estaba estandarizada en C ++ 11.
Es probable que estas funciones sean de interés principal para los programadores de las disciplinas científicas y de ingeniería.
La siguiente tabla muestra las 23 funciones especiales descritas en TR1.
Nombre de la función | Prototipo de función | Expresión matemática |
---|---|---|
Polinomios de Laguerre asociados | double assoc_laguerre (sin firmar n, sin firmar m, doble x); | |
Polinomios de Legendre asociados | double assoc_legendre (sin firmar l, sin firmar m, doble x); | |
Función beta | doble beta (doble x, doble y); | |
Integral elíptica completa del primer tipo | double comp_ellint_1 (doble k); | |
Integral elíptica completa del segundo tipo | double comp_ellint_2 (doble k); | |
Integral elíptica completa de tercer tipo | double comp_ellint_3 (doble k, doble nu); | |
Funciones hipergeométricas confluentes | double conf_hyperg (doble a, doble c, doble x); | |
Funciones de Bessel cilíndricas modificadas regulares | doble cyl_bessel_i (doble nu, doble x); | |
Funciones de Bessel cilíndricas del primer tipo | double cyl_bessel_j (doble nu, doble x); | |
Funciones de Bessel cilíndricas modificadas irregulares | double cyl_bessel_k (doble nu, doble x); | |
Funciones cilíndricas de Neumann | doble cyl_neumann (doble nu, doble x); | |
Integral elíptica incompleta del primer tipo | double ellint_1 (doble k, doble phi); | |
Integral elíptica incompleta del segundo tipo | doble ellint_2 (doble k, doble phi); | |
Integral elíptica incompleta de tercer tipo | double ellint_3 (doble k, doble nu, doble phi); | |
Integral exponencial | doble expint (doble x); | |
Polinomios de Hermite | doble hermita (sin firmar n, doble x); | |
Serie hipergeométrica | doble hiperg (doble a, doble b, doble c, doble x); | |
Polinomios de Laguerre | doble laguerre (sin signo n, doble x); | |
Polinomios de Legendre | double legendre (sin firmar l, doble x); | |
Función zeta de Riemann | doble riemann_zeta (doble x); | |
Funciones esféricas de Bessel del primer tipo | doble sph_bessel (sin signo n, doble x); | |
Funciones de Legendre asociadas esféricas | double sph_legendre (l sin signo, m sin signo, doble theta); | |
Funciones esféricas de Neumann | doble sph_neumann (sin signo n, doble x); |
Cada función tiene dos variantes adicionales. Agregar el sufijo ' f ' o ' l ' al nombre de una función da una función que opera en valores float
o long double
respectivamente. Por ejemplo:
float sph_neumannf( unsigned n, float x ) ;
long double sph_neumannl( unsigned n, long double x ) ;
Contenedores
Tipos de tuplas
- nuevo
<tuple>
archivo de encabezado -tuple
- basado en la biblioteca Boost Tuple
- vagamente una extensión del estándar
std::pair
- colección de elementos de tamaño fijo, que pueden ser de diferentes tipos
Matriz de tamaño fijo
- nuevo
<array>
archivo de encabezado -array
- tomado de la biblioteca Boost Array
- a diferencia de los tipos de matriz dinámica como el estándar
std::vector
Tablas hash
- nuevos
<unordered_set>
, archivos de cabecera<unordered_map>
- implementan el
unordered_set
,unordered_multiset
,unordered_map
, yunordered_multimap
clases, análogo aset
,multiset
,map
, ymultimap
, respectivamente- Por desgracia,
unordered_set
yunordered_multiset
no se puede utilizar con losset_union
,set_intersection
,set_difference
,set_symmetric_difference
, yincludes
las funciones de la biblioteca estándar, que trabajan paraset
ymultiset
- Por desgracia,
- nueva implementación, no derivada de una biblioteca existente, no totalmente compatible con la API con las bibliotecas existentes
- como todas las tablas hash , a menudo proporcionan una búsqueda constante de elementos en el tiempo, pero el peor de los casos puede ser lineal en el tamaño del contenedor
Expresiones regulares
- nuevo
<regex>
archivo de cabecera -regex
,regex_match
,regex_search
,regex_replace
, etc. - basado en la biblioteca Boost RegEx
- biblioteca de coincidencia de patrones
Compatibilidad C
C ++ está diseñado para ser compatible con el lenguaje de programación C , pero no es un superconjunto estricto de C debido a estándares divergentes. TR1 intenta reconciliar algunas de estas diferencias mediante adiciones a varios encabezados en la biblioteca de C ++, como <complex>, <locale>, <cmath>, etc. Estos cambios ayudan a que C ++ esté más en línea con la versión C99 de C estándar (no todas las partes de C99 están incluidas en TR1).
Informe técnico 2
En 2005, se realizó una solicitud de propuestas para un TR2 con especial interés en Unicode, XML / HTML, Networking y usabilidad para programadores novatos. Convocatoria de propuestas TR2 .
Algunas de las propuestas incluyeron:
- Hilos [1]
- La biblioteca Asio C ++ (networking [2] [3] ).
- Señales / Ranuras [sigc Propuesta de estandarización en la biblioteca C ++ TR2] [4]
- Biblioteca del sistema de archivos Biblioteca del sistema de archivos para TR2 : basada en la biblioteca del sistema de archivos Boost, para consultas / manipulación de rutas, archivos y directorios.
- Impulse cualquier biblioteca Cualquier propuesta de biblioteca para TR2
- Propuesta de biblioteca de conversión de biblioteca de conversión léxica para TR2
- Nueva propuesta de algoritmos de cadena para nuevos algoritmos de cadena en TR2
- Hacia una taxonomía más completa de propiedades algebraicas para bibliotecas numéricas en TR2 ISO / IEC JTC1 / SC22 / WG21 - Papers 2008
- Agregar búsqueda de comparación heterogénea a contenedores asociativos para TR2 [5]
Después de que se emitió la convocatoria de propuestas para TR2, se cambiaron los procedimientos ISO, por lo que no habrá un TR2. En cambio, las mejoras de C ++ se publicarán en una serie de Especificaciones técnicas. Algunas de las propuestas enumeradas anteriormente ya están incluidas en el estándar C ++ o en versiones preliminares de las Especificaciones técnicas.
Ver también
- C ++ 11 , estándar para el lenguaje de programación C ++; las mejoras de la biblioteca se basaron en TR1
- C11 (revisión del estándar C) , el estándar más reciente para el lenguaje de programación C
- Boost library , una gran colección de bibliotecas portátiles de C ++, varias de las cuales se incluyeron en TR1
- Biblioteca de plantillas estándar , parte de la biblioteca estándar de C ++ actual
Referencias
Fuentes
- ISO / IEC JTC1 / SC22 / WG21 - Informe técnico preliminar sobre extensiones de biblioteca C ++ (PDF) (Informe). 2005-06-24.
- ISO / IEC TR 19768: 2007 - Tecnología de la información - Lenguajes de programación - Informe técnico sobre extensiones de biblioteca C ++ (Informe). Noviembre de 2007.
- Becker, Peter (2006). Extensiones de biblioteca estándar de C ++: tutorial y referencia . Addison-Wesley Professional. ISBN 0-321-41299-0.
enlaces externos
- Eficaz C ++ de Scott Meyers: Información de TR1 : contiene enlaces a los documentos de la propuesta de TR1 que proporcionan antecedentes y fundamentos de las bibliotecas de TR1.