Relatório Técnico C ++ 1 - C++ Technical Report 1
C ++ Technical Report 1 ( TR1 ) é o nome comum para ISO / IEC TR 19768, C ++ Library Extensions , que é um documento que propôs adições à biblioteca padrão C ++ para o padrão de linguagem C ++ 03 . As adições incluem expressões regulares , ponteiros inteligentes , tabelas de hash e geradores de números aleatórios . TR1 não era um padrão em si, mas sim um rascunho de documento. No entanto, a maioria de suas propostas tornou-se parte do padrão oficial posterior, C ++ 11. Antes do C ++ 11 ser padronizado, os fornecedores usavam este documento como um guia para criar extensões. O objetivo do relatório era "construir uma prática existente mais difundida para uma biblioteca padrão C ++ expandida".
O relatório foi distribuído pela primeira vez em forma de rascunho em 2005 como Rascunho de Relatório Técnico sobre Extensões de Biblioteca C ++ , então publicado em 2007 como um padrão ISO / IEC como ISO / IEC TR 19768: 2007 .
Visão geral
Os compiladores não precisaram incluir os componentes do TR1 para se adequar ao padrão C ++, pois as propostas do TR1 não faziam parte do próprio padrão, apenas um conjunto de possíveis adições que ainda não foram ratificadas. No entanto, a maior parte do TR1 estava disponível na Boost e vários distribuidores de compiladores / bibliotecas implementaram todos ou alguns dos componentes. TR1 não é a lista completa de adições à biblioteca que apareceu em C ++ 11 . Por exemplo, C ++ 11 inclui uma biblioteca de suporte de thread que não está disponível em TR1.
Os novos componentes foram definidos no std::tr1
namespace para distingui-los da biblioteca padrão então atual.
Componentes
TR1 inclui os seguintes componentes:
Utilitários gerais
Wrapper de referência - permite a passagem de referências , em vez de cópias, para algoritmos ou objetos de função. O recurso foi baseado em Boost.Ref. Uma referência de wrapper é obtida de uma instância da classe de modelo reference_wrapper
. As referências do wrapper são semelhantes às referências normais ('&') da linguagem C ++. Para obter uma referência de wrapper de qualquer objeto, a classe de modelo ref
é usada (para uma referência constante cref
é usada).
Referências de wrapper são úteis acima de tudo para funções de modelo, quando a dedução de argumento não deduziria uma referência (por exemplo, ao encaminhar 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
}
Ponteiros inteligentes - adiciona várias classes que simplificam o gerenciamento do tempo de vida do objeto em casos complexos. Três classes principais são adicionadas:
-
shared_ptr
- um ponteiro inteligente com contagem de referência -
weak_ptr
- uma varianteshared_ptr
disso não aumenta a contagem de referência
A proposta é baseada na biblioteca Boost Smart Pointer.
Objetos de função
Esses quatro módulos são adicionados ao <functional>
arquivo de cabeçalho:
Wrapper de função polimórfica ( function
) - pode armazenar qualquer função chamável (ponteiros de função, ponteiros de função de membro e objetos de função) que usa uma assinatura de chamada de função especificada. O tipo não depende do tipo de chamável usado. Baseado em Boost.Function
Binders de objeto de função ( bind
) - pode vincular qualquer parâmetro de parâmetro a objetos de função. A composição de funções também é permitida. Esta é uma versão generalizada das funções padrão std::bind1st
e de std::bind2nd
ligação. O recurso é baseado na biblioteca Boost Bind.
Tipos de retorno de função ( result_of
) - determina o tipo de uma expressão de chamada.
Funções de membro ( mem_fn
) - aprimoramento do padrão std::mem_fun
e std::mem_fun_ref
. Permite que ponteiros para funções- membro sejam tratados como objetos de função. Baseado na biblioteca Boost Mem Fn.
Metaprogramação e características de tipo
Existe agora <type_traits>
arquivo de cabeçalho que contém muitos meta-modelos característica útil, como is_pod
, has_virtual_destructor
, remove_extent
, etc. Facilita metaprogramming, permitindo consultas sobre e transformação entre diferentes tipos . A proposta é baseada na biblioteca Boost Type Traits.
Instalações numéricas
Geração de número aleatório
- novo
<random>
arquivo de cabeçalho -variate_generator
,mersenne_twister
,poisson_distribution
, etc. - utilitários para gerar números aleatórios usando qualquer um dos vários geradores de números pseudo-aleatórios , motores e distribuições de probabilidade
Funções matemáticas especiais
Alguns recursos do TR1, como as funções matemáticas especiais e certas adições do C99, não estão incluídos na implementação do Visual C ++ do TR1. A biblioteca de funções especiais matemáticas não foi padronizada em C ++ 11.
Essas funções provavelmente serão de interesse principal para os programadores nas disciplinas científicas e de engenharia.
A tabela a seguir mostra todas as 23 funções especiais descritas em TR1.
Nome da função | Protótipo de função | Expressão matemática |
---|---|---|
Polinômios de Laguerre associados | double assoc_laguerre (n sem sinal, m sem sinal, x duplo); | |
Polinômios de Legendre associados | double assoc_legendre (sem sinal l, sem sinal m, duplo x); | |
Função beta | beta duplo (duplo x, duplo y); | |
Integral elíptica completa de primeiro tipo | comp_ellint_1 duplo (duplo k); | |
Integral elíptico completo de segundo tipo | comp_ellint_2 duplo (k duplo); | |
Integral elíptica completa de terceiro tipo | double comp_ellint_3 (double k, double nu); | |
Funções hipergeométricas confluentes | duplo conf_hyperg (duplo a, duplo c, duplo x); | |
Funções de Bessel cilíndricas modificadas regulares | cil_bessel_i duplo (nu duplo, x duplo); | |
Funções cilíndricas de Bessel de primeiro tipo | cil_bessel_j duplo (nu duplo, x duplo); | |
Funções de Bessel cilíndricas modificadas irregulares | cil_bessel_k duplo (nu duplo, x duplo); | |
Funções cilíndricas de Neumann | cil_neumann duplo (nu duplo, x duplo); | |
Integral elíptica incompleta de primeiro tipo | duplo ellint_1 (duplo k, duplo phi); | |
Integral elíptica incompleta de segundo tipo | ellint_2 duplo (k duplo, phi duplo); | |
Integral elíptica incompleta de terceiro tipo | ellint_3 duplo (k duplo, nu duplo, phi duplo); | |
Integral exponencial | expint duplo (duplo x); | |
Polinômios de Hermite | hermite dupla (n sem sinal, x duplo); | |
Série Hipergeométrica | duplo hyperg (duplo, duplo b, c duas vezes, duas vezes x); | |
Polinômios de Laguerre | laguerre duplo (n sem sinal, x duplo); | |
Polinômios de Legendre | legenda dupla (l sem sinal, x duplo); | |
Função zeta de Riemann | riemann_zeta duplo (duplo x); | |
Funções esféricas de Bessel de primeiro tipo | sph_bessel duplo (n sem sinal, x duplo); | |
Funções esféricas de Legendre associadas | sph_legendre duplo (l sem sinal, m sem sinal, teta duplo); | |
Funções esféricas de Neumann | sph_neumann duplo (n sem sinal, x duplo); |
Cada função possui duas variantes adicionais. Anexar o sufixo ' f ' ou ' l ' a um nome de função fornece uma função que opera em valores float
ou long double
respectivamente. Por exemplo:
float sph_neumannf( unsigned n, float x ) ;
long double sph_neumannl( unsigned n, long double x ) ;
Containers
Tipos de tupla
- novo
<tuple>
arquivo de cabeçalho -tuple
- baseado na biblioteca Boost Tuple
- vagamente uma extensão do padrão
std::pair
- coleção de elementos de tamanho fixo, que podem ser de diferentes tipos
Matriz de tamanho fixo
- novo
<array>
arquivo de cabeçalho -array
- retirado da biblioteca Boost Array
- em oposição aos tipos de matriz dinâmica, como o padrão
std::vector
Tabelas de hash
- novos
<unordered_set>
, arquivos de cabeçalho<unordered_map>
- eles implementar o
unordered_set
,unordered_multiset
,unordered_map
, eunordered_multimap
as classes, análogo aoset
,multiset
,map
, emultimap
, respectivamente- infelizmente,
unordered_set
eunordered_multiset
não pode ser usado com osset_union
,set_intersection
,set_difference
,set_symmetric_difference
, eincludes
funções da biblioteca padrão, que trabalham paraset
emultiset
- infelizmente,
- nova implementação, não derivada de uma biblioteca existente, não totalmente compatível com a API das bibliotecas existentes
- como todas as tabelas de hash , muitas vezes fornecem pesquisa de tempo constante de elementos, mas o pior caso pode ser linear no tamanho do contêiner
Expressões regulares
- novo
<regex>
arquivo de cabeçalho -regex
,regex_match
,regex_search
,regex_replace
, etc. - baseado na biblioteca Boost RegEx
- biblioteca de correspondência de padrões
Compatibilidade C
C ++ foi projetado para ser compatível com a linguagem de programação C , mas não é um superconjunto estrito de C devido a padrões divergentes. TR1 tenta reconciliar algumas dessas diferenças por meio de adições a vários cabeçalhos na biblioteca C ++, como <complex>, <locale>, <cmath>, etc. Essas alterações ajudam a trazer o C ++ mais alinhado com a versão C99 do C padrão (nem todas as peças do C99 estão incluídas no TR1).
Relatório Técnico 2
Em 2005, foi feito um pedido de propostas para um TR2 com especial interesse em Unicode, XML / HTML, Networking e usabilidade para programadores novatos. Chamada TR2 à apresentação de propostas .
Algumas das propostas incluíram:
- Tópicos [1]
- A biblioteca Asio C ++ (rede [2] [3] ).
- Sinais / Slots [sigc Proposta para padronização na Biblioteca C ++ TR2] [4]
- Filesystem Library Filesystem Library for TR2 - Baseada na Boost Filesystem Library, para consulta / manipulação de caminhos, arquivos e diretórios.
- Impulsione Qualquer Biblioteca Qualquer Proposta de Biblioteca para TR2
- Biblioteca de Conversão Lexical Proposta de Conversão de Biblioteca para TR2
- New String Algoritmos Proposta de novos algoritmos de cordas em TR2
- Rumo a uma taxonomia mais completa de propriedades algébricas para bibliotecas numéricas em TR2 ISO / IEC JTC1 / SC22 / WG21 - Artigos de 2008
- Adicionando pesquisa de comparação heterogênea a contêineres associativos para TR2 [5]
Após a chamada de propostas para TR2, os procedimentos da ISO foram alterados, então não haverá um TR2. Em vez disso, as melhorias para C ++ serão publicadas em uma série de Especificações Técnicas. Algumas das propostas listadas acima já estão incluídas no padrão C ++ ou em versões de rascunho das Especificações Técnicas.
Veja também
- C ++ 11 , padrão para a linguagem de programação C ++; as melhorias da biblioteca foram baseadas em TR1
- C11 (revisão do padrão C) , o padrão mais recente para a linguagem de programação C
- Biblioteca Boost , uma grande coleção de bibliotecas C ++ portáteis, várias das quais foram incluídas no TR1
- Biblioteca de modelos padrão , parte da biblioteca padrão C ++ atual
Referências
Fontes
- ISO / IEC JTC1 / SC22 / WG21 - Rascunho do Relatório Técnico sobre Extensões da Biblioteca C ++ (PDF) (Relatório). 24/06/2005.
- ISO / IEC TR 19768: 2007 - Tecnologia da informação - Linguagens de programação - Relatório técnico sobre extensões de biblioteca C ++ (Relatório). Novembro de 2007.
- Becker, Peter (2006). As extensões da biblioteca padrão C ++: um tutorial e referência . Addison-Wesley Professional. ISBN 0-321-41299-0.
links externos
- Scott Meyers 'Effective C ++: TR1 Information - contém links para os documentos da proposta TR1 que fornecem o histórico e a justificativa para as bibliotecas TR1.