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 variante shared_ptrdisso 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::bind1ste de std::bind2ndligaçã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_fune 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

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.

  • adições aos <cmath>/ <math.h>arquivos de cabeçalho - beta, legendre, etc.

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

Funções cilíndricas de Bessel de segundo tipo

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

Funções esféricas de Bessel de segundo tipo

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 floatou long doublerespectivamente. 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, e unordered_multimapas classes, análogo ao set, multiset, map, e multimap, respectivamente
    • infelizmente, unordered_sete unordered_multisetnão pode ser usado com os set_union, set_intersection, set_difference, set_symmetric_difference, e includesfunções da biblioteca padrão, que trabalham para setemultiset
  • 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:

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

Referências

Fontes

links externos