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 refse usa la clase de plantilla (para una referencia constante crefse 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 de shared_ptreso 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::bind1sty de std::bind2ndvinculació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_funy 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

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.

  • adiciones a las <cmath>/ <math.h>los archivos de cabecera - beta, legendre, etc.

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

Funciones de Bessel cilíndricas del segundo tipo

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

Funciones esféricas de Bessel del segundo tipo

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 floato long doublerespectivamente. 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, y unordered_multimapclases, análogo a set, multiset, map, y multimap, respectivamente
    • Por desgracia, unordered_sety unordered_multisetno se puede utilizar con los set_union, set_intersection, set_difference, set_symmetric_difference, y includeslas funciones de la biblioteca estándar, que trabajan para setymultiset
  • 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:

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

Referencias

Fuentes

enlaces externos