C++ Teknik Raporu 1 - C++ Technical Report 1

C++ Teknik Rapor 1 ( TR1 ), C++03 dil standardı için C++ standart kitaplığına eklemeler öneren bir belge olan ISO/IEC TR 19768, C++ Kitaplık Uzantılarının ortak adıdır . Eklemeler arasında normal ifadeler , akıllı işaretçiler , karma tablolar ve rastgele sayı üreteçleri bulunur . TR1 bir standart değil, bir taslak belgeydi. Ancak, tekliflerinin çoğu daha sonraki resmi standart olan C++11'in bir parçası oldu.. C++11 standartlaştırılmadan önce, satıcılar bu belgeyi uzantı oluşturmak için bir kılavuz olarak kullanıyordu. Raporun amacı "genişletilmiş bir C++ standart kitaplığı için daha yaygın bir mevcut uygulama oluşturmak" idi.

Rapor ilk olarak 2005 yılında taslak halinde C++ Kütüphane Uzantıları Üzerine Taslak Teknik Rapor olarak dağıtıldı , ardından 2007'de ISO/IEC TR 19768:2007 olarak bir ISO/IEC standardı olarak yayınlandı .

genel bakış

Derleyicilerin C++ standardına uymak için TR1 bileşenlerini dahil etmesine gerek yoktu, çünkü TR1 önerileri standardın kendisinin bir parçası değildi, yalnızca henüz onaylanması gereken bir dizi olası eklemeydi. Ancak TR1 çoğundan sunulmuştu Boost ve birkaç derleyici / kütüphane distribütörleri tamamını veya bileşenlerden bazıları uyguladı. TR1, C++11'de kitaplığa yapılan eklemelerin tam listesi değildir . Örneğin, C++11, TR1'de bulunmayan bir iş parçacığı destek kitaplığı içerir.

Yeni bileşenler , o sırada geçerli olan standart kitaplıktan ayırt edilmeleri için std::tr1 ad alanında tanımlandı .

Bileşenler

TR1 aşağıdaki bileşenleri içerir:

Genel yardımcı programlar

Referans sarmalayıcı - kopyalar yerine referansların algoritmalara veya işlev nesnelerine iletilmesini sağlar. Bu özellik Boost.Ref'e dayanıyordu. Şablon sınıfının bir örneğinden bir sarmalayıcı başvurusu elde edilir reference_wrapper. Sarmalayıcı başvuruları, C++ dilinin normal başvurularına ('&') benzer. Herhangi bir nesneden bir sarmalayıcı referansı elde etmek için şablon sınıfı refkullanılır (sabit bir referans crefiçin kullanılır).

Sarmalayıcı referansları, her şeyden önce, argüman kesintisinin bir referans çıkarmayacağı durumlarda (örneğin argümanları iletirken) şablon işlevleri için yararlıdır:

#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
}

Akıllı işaretçiler – karmaşık durumlarda nesne kullanım ömrü yönetimini basitleştiren birkaç sınıf ekler. Üç ana sınıf eklenir:

  • shared_ptr – referans sayılan bir akıllı işaretçi
  • weak_ptr– bunun bir çeşidi shared_ptrreferans sayısını artırmaz

Teklif, Boost Smart Pointer kitaplığına dayanmaktadır.

İşlev nesneleri

Bu dört modül <functional>başlık dosyasına eklenir :

Çok biçimli işlev sarmalayıcı ( function) – belirtilen bir işlev çağrısı imzasını kullanan çağrılabilir herhangi bir işlevi (işlev işaretçileri, üye işlev işaretçileri ve işlev nesneleri) saklayabilir. Tür, kullanılan çağrılabilir türüne bağlı değildir. Boost.Function'a dayalı

İşlev nesnesi bağlayıcıları ( bind) – herhangi bir parametre parametresini işlev nesnelerine bağlayabilir . İşlev bileşimine de izin verilir. Bu, standart std::bind1stve std::bind2ndbağlama işlevlerinin genelleştirilmiş bir sürümüdür . Bu özellik, Boost Bind kitaplığına dayanmaktadır.

İşlev dönüş türleri ( result_of) – bir çağrı ifadesinin türünü belirler.

Üye işlevleri ( mem_fn) – standart geliştirme std::mem_funve std::mem_fun_ref. Üye işlevlerin işaretçilerinin işlev nesneleri olarak ele alınmasına izin verir . Boost Mem Fn kitaplığına dayalıdır.

Metaprogramlama ve tip özellikleri

Artık , , , vb. <type_traits>gibi birçok kullanışlı özellik meta şablonunu içeren başlık dosyası var . Farklı türler arasında sorgular ve dönüşümler sağlayarak metaprogramlamayı kolaylaştırır . Teklif, Boost Type Traits kitaplığına dayanmaktadır. is_podhas_virtual_destructorremove_extent

Sayısal tesisler

Rastgele sayı üretimi

Matematiksel özel fonksiyonlar

Matematiksel özel işlevler ve belirli C99 eklemeleri gibi TR1'in bazı özellikleri, TR1'in Visual C++ uygulamasına dahil edilmemiştir. Matematiksel özel işlevler kitaplığı, C++ 11'de standartlaştırılmamıştır.

  • <cmath>/ <math.h>başlık dosyalarına eklemeler – beta, legendre, vb.

Bu işlevler muhtemelen mühendislik ve bilimsel disiplinlerdeki programcıların başlıca ilgisini çekecektir.

Aşağıdaki tablo, TR1'de açıklanan 23 özel işlevin tümünü gösterir.

Fonksiyon adı Fonksiyon prototipi matematiksel ifade
İlişkili Laguerre polinomları double assoc_laguerre ( işaretsiz n, işaretsiz m, çift x );
İlişkili Legendre polinomları double assoc_legendre ( işaretsiz l, işaretsiz m, çift x );
Beta işlevi çift beta ( çift x, çift y );
Birinci türden tam eliptik integral double comp_ellint_1 (çift k);
İkinci türden tam eliptik integral double comp_ellint_2 (çift k);
Üçüncü türden tam eliptik integral double comp_ellint_3 ( double k, double nu );
Birleşen hipergeometrik fonksiyonlar double conf_hyperg ( double a, double c, double x );
Düzenli modifiye silindirik Bessel fonksiyonları double cyl_bessel_i ( double nu, double x );
Birinci türden silindirik Bessel fonksiyonları double cyl_bessel_j ( double nu, double x );
Düzensiz değiştirilmiş silindirik Bessel fonksiyonları double cyl_bessel_k ( double nu, double x );
Silindirik Neumann fonksiyonları

İkinci tür silindirik Bessel fonksiyonları

double cyl_neumann ( double nu, double x );
Birinci türden tamamlanmamış eliptik integral çift ellint_1 ( çift k, çift phi );
İkinci türden tamamlanmamış eliptik integral double ellint_2 (çift k, çift phi);
Üçüncü türden eksik eliptik integral double ellint_3 ( double k, double nu, double phi );
üstel integral çift nokta (çift x);
Hermit polinomları çift hermit ( işaretsiz n, çift x ) ;
hipergeometrik seri çift hiperg ( çift a, çift b, çift c, çift x );
Laguerre polinomları double laguerre ( işaretsiz n, double x ) ;
Legendre polinomları çift efsane ( işaretsiz l, çift x );
Riemann zeta fonksiyonu çift riemann_zeta (çift x);
Birinci türden Küresel Bessel fonksiyonları double sph_bessel ( işaretsiz n, double x );
Küresel ilişkili Legendre işlevleri double sph_legendre (işaretsiz l, işaretsiz m, çift teta);
Küresel Neumann fonksiyonları

İkinci türden Küresel Bessel fonksiyonları

double sph_neumann ( işaretsiz n, double x );

Her işlevin iki ek varyantı vardır. Bir işlev adına ' f ' veya ' l ' son ekinin eklenmesi, sırasıyla üzerinde floatveya long doubledeğerleri üzerinde çalışan bir işlev verir . Örneğin:

float sph_neumannf( unsigned n, float x ) ;
long double sph_neumannl( unsigned n, long double x ) ;

Konteynerler

demet türleri

  • yeni <tuple>başlık dosyası –tuple
  • Boost Tuple kitaplığına dayalı
  • belirsiz bir şekilde standardın bir uzantısı std::pair
  • farklı tiplerde olabilen sabit boyutlu eleman koleksiyonu

Sabit boyutlu dizi

  • yeni <array>başlık dosyası –array
  • Boost Array kitaplığından alındı
  • standart gibi dinamik dizi türlerinin aksine std::vector

Hash tabloları

  • yeni <unordered_set>, başlık dosyaları<unordered_map>
  • uyguladıkları unordered_set, unordered_multiset, unordered_map, ve unordered_multimapsınıflar, benzer üzere set, multiset, mapve multimapsırasıyla
    • maalesef unordered_setve unordered_multisetbirlikte kullanılamaz set_union, set_intersection, set_difference, set_symmetric_difference, ve includesstandart kütüphane fonksiyonları, çalışma için setvemultiset
  • yeni uygulama, mevcut bir kitaplıktan türetilmemiş, mevcut kitaplıklarla tam API uyumlu değil
  • tüm karma tablolar gibi , genellikle öğelerin sürekli olarak aranmasını sağlar, ancak en kötü durum, kabın boyutunda doğrusal olabilir

Düzenli ifadeler

  • yeni <regex>başlık dosyası – regex, regex_match, regex_search, regex_replace, vb.
  • Boost RegEx kitaplığına dayalı
  • desen eşleştirme kitaplığı

C uyumluluğu

C++ , C programlama diliyle uyumlu olacak şekilde tasarlanmıştır , ancak farklı standartlar nedeniyle C'nin katı bir üst kümesi değildir. TR1, <complex>, <locale>, <cmath> vb. gibi C++ kitaplığındaki çeşitli başlıklara eklemeler yaparak bu farklılıkların bazılarını uzlaştırmaya çalışır. Bu değişiklikler, C++'ı C'nin C99 sürümüyle daha uyumlu hale getirmeye yardımcı olur. standart (C99'un tüm parçaları TR1'e dahil değildir).

Teknik Rapor 2

2005 yılında, Unicode, XML/HTML, Ağ Oluşturma ve acemi programcılar için kullanılabilirlik konularına özel ilgi gösteren bir TR2 için teklif talebi yapıldı. TR2 teklif çağrısı .

Tekliflerden bazıları şunları içeriyordu:

TR2 için teklif çağrısı yapıldıktan sonra ISO prosedürleri değiştirildi, dolayısıyla TR2 olmayacak. Bunun yerine, C++ geliştirmeleri bir dizi Teknik Spesifikasyonda yayınlanacaktır. Yukarıda listelenen bazı teklifler, C++ standardında veya Teknik Spesifikasyonların taslak versiyonlarında zaten yer almaktadır.

Ayrıca bakınız

Referanslar

Kaynaklar

Dış bağlantılar