C++ Technical Report 1
Find sources: "C++ Technical Report 1" – news · newspapers · books · scholar · JSTOR (October 2021)
C++ Technical Report 1 (TR1) is the common name for ISO/IEC TR 19768, C++ Library Extensions, which is a document that proposed additions to the C++ standard library for the C++03 language standard. The additions include regular expressions, smart pointers, hash tables, and random number generators. TR1 was not a standard itself, but rather a draft document. However, most of its proposals became part of the later official standard, C++11. Before C++11 was standardized, vendors used this document as a guide to create extensions. The report's goal was "to build more widespread existing practice for an expanded C++ standard library".
The report was first circulated in draft form in 2005 as Draft Technical Report on C++ Library Extensions, then published in 2007 as an ISO/IEC standard as ISO/IEC TR 19768:2007.
Overview
[edit ]Compilers did not need to include the TR1 components in order to conform to the C++ standard, because TR1 proposals were not part of the standard itself, only a set of possible additions that were still to be ratified. However, most of TR1 was available from Boost, and several compiler/library distributors implemented all or some of the components. TR1 is not the complete list of additions to the library that appeared in C++11. For example, C++11 includes a thread support library that is not available in TR1.
The new components were defined in the std::tr1 namespace to distinguish them from the then-current standard library.
Components
[edit ]TR1 includes the following components:
General utilities
[edit ]Reference wrapper – enables passing references, rather than copies, into algorithms or function objects. The feature was based on Boost.Ref.[1] A wrapper reference is obtained from an instance of the template class reference_wrapper. Wrapper references are similar to normal references (‘&’) of the C++ language. To obtain a wrapper reference from any object the template class ref is used (for a constant reference cref is used).
Wrapper references are useful above all for template functions, when argument deduction would not deduce a reference (e.g. when forwarding arguments):
#include<iostream> #include<tr1/functional> voidf(int&r){ ++r; } template<classFunc,classArg> voidg(Funcf,Argt){ f(t); } intmain(){ inti=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), std::tr1::reference_wrapper<int>>' is instanced std::cout<<i<<"\n";// Output: 1 }
Smart pointers – adds several classes that simplify object lifetime management in complex cases. Three main classes are added:
shared_ptr– a reference-counted smart pointerweak_ptr– a variant ofshared_ptrthat doesn't increase the reference count
The proposal is based on Boost Smart Pointer library.[2]
Function objects
[edit ]These four modules are added to the <functional> header file:
Polymorphic function wrapper (function) – can store any callable function (function pointers, member function pointers, and function objects) that uses a specified function call signature. The type does not depend on the kind of the callable used. Based on Boost.Function[3]
Function object binders (bind) – can bind any parameter parameters to function objects. Function composition is also allowed. This is a generalized version of the standard std::bind1st and std::bind2nd bind functions. The feature is based on Boost Bind library.[4]
Function return types (result_of) – determines the type of a call expression.
Member functions (mem_fn) – enhancement to the standard std::mem_fun and std::mem_fun_ref. Allows pointers to member functions to be treated as function objects. Based on Boost Mem Fn library.[5]
Metaprogramming and type traits
[edit ]There is now <type_traits> header file that contains many useful trait meta-templates, such as is_pod, has_virtual_destructor, remove_extent, etc. It facilitates metaprogramming by enabling queries on and transformation between different types. The proposal is based on Boost Type Traits library.[6]
Numerical facilities
[edit ]Random number generation
[edit ]- new
<random>header file –variate_generator,mersenne_twister,poisson_distribution, etc. - utilities for generating random numbers using any of several Pseudorandom number generators, engines, and probability distributions
Mathematical special functions
[edit ]Some features of TR1, such as the mathematical special functions and certain C99 additions, are not included in the Visual C++ implementation of TR1. The Mathematical special functions library was not standardized in C++11.
These functions will likely be of principal interest to programmers in the engineering and scientific disciplines.
The following table shows all 23 special functions described in TR1.
| Function name | Function prototype | Mathematical expression |
|---|---|---|
| Associated Laguerre polynomials | doubleassoc_laguerre(unsignedintn,unsignedintm,doublex); |
{\displaystyle {L_{n}}^{m}(x)=(-1)^{m}{\frac {d^{m}}{dx^{m}}}L_{n+m}(x),{\text{ for }}x\geq 0} |
| Associated Legendre polynomials | doubleassoc_legendre(unsignedintl,unsignedintm,doublex); |
{\displaystyle {P_{l}}^{m}(x)=(1-x^{2})^{m/2}{\frac {d^{m}}{dx^{m}}}P_{l}(x),{\text{ for }}x\geq 0} |
| Beta function | doublebeta(doublex,doubley); |
{\displaystyle \mathrm {B} (x,y)={\frac {\Gamma (x)\Gamma (y)}{\Gamma (x+y)}}} |
| Complete elliptic integral of the first kind | doublecomp_ellint_1(doublek); |
{\displaystyle K(k)=F\left(k,\textstyle {\frac {\pi }{2}}\right)=\int _{0}^{\frac {\pi }{2}}{\frac {d\theta }{\sqrt {1-k^{2}\sin ^{2}\theta }}}} |
| Complete elliptic integral of the second kind | doublecomp_ellint_2(doublek); |
{\displaystyle E\left(k,\textstyle {\frac {\pi }{2}}\right)=\int _{0}^{\frac {\pi }{2}}{\sqrt {1-k^{2}\sin ^{2}\theta }}\;d\theta } |
| Complete elliptic integral of the third kind | doublecomp_ellint_3(doublek,doublenu); |
{\displaystyle \Pi \left(\nu ,k,\textstyle {\frac {\pi }{2}}\right)=\int _{0}^{\frac {\pi }{2}}{\frac {d\theta }{(1-\nu \sin ^{2}\theta ){\sqrt {1-k^{2}\sin ^{2}\theta }}}}} |
| Confluent hypergeometric functions | doubleconf_hyperg(doublea,doublec,doublex); |
{\displaystyle F(a,c,x)={\frac {\Gamma (c)}{\Gamma (a)}}\sum _{n=0}^{\infty }{\frac {\Gamma (a+n)x^{n}}{\Gamma (c+n)n!}}} |
| Regular modified cylindrical Bessel functions | doublecyl_bessel_i(doublenu,doublex); |
{\displaystyle I_{\nu }(x)=i^{-\nu }J_{\nu }(ix)=\sum _{k=0}^{\infty }{\frac {(x/2)^{\nu +2k}}{k!\;\Gamma (\nu +k+1)}},{\text{ for }}x\geq 0} |
| Cylindrical Bessel functions of the first kind | doublecyl_bessel_j(doublenu,doublex); |
{\displaystyle J_{\nu }(x)=\sum _{k=0}^{\infty }{\frac {(-1)^{k}\;(x/2)^{\nu +2k}}{k!\;\Gamma (\nu +k+1)}},{\text{ for }}x\geq 0} |
| Irregular modified cylindrical Bessel functions | doublecyl_bessel_k(doublenu,doublex); |
{\displaystyle {\begin{aligned}K_{\nu }(x)&=\textstyle {\frac {\pi }{2}}i^{\nu +1}{\big (}J_{\nu }(ix)+iN_{\nu }(ix){\big )}\\&={\begin{cases}\displaystyle {\frac {I_{-\nu }(x)-I_{\nu }(x)}{\sin \nu \pi }},&{\text{for }}x\geq 0{\text{ and }}\nu \notin \mathbb {Z} \\[10pt]\displaystyle {\frac {\pi }{2}}\lim _{\mu \to \nu }{\frac {I_{-\mu }(x)-I_{\mu }(x)}{\sin \mu \pi }},&{\text{for }}x<0{\text{ and }}\nu \in \mathbb {Z} \\\end{cases}}\end{aligned}}} |
| Cylindrical Neumann functions | doublecyl_neumann(doublenu,doublex); |
{\displaystyle N_{\nu }(x)={\begin{cases}\displaystyle {\frac {J_{\nu }(x)\cos \nu \pi -J_{-\nu }(x)}{\sin \nu \pi }},&{\text{for }}x\geq 0{\text{ and }}\nu \notin \mathbb {Z} \\[10pt]\displaystyle \lim _{\mu \to \nu }{\frac {J_{\mu }(x)\cos \mu \pi -J_{-\mu }(x)}{\sin \mu \pi }},&{\text{for }}x<0{\text{ and }}\nu \in \mathbb {Z} \\\end{cases}}} |
| Incomplete elliptic integral of the first kind | doubleellint_1(doublek,doublephi); |
{\displaystyle F(k,\phi )=\int _{0}^{\phi }{\frac {d\theta }{\sqrt {1-k^{2}\sin ^{2}\theta }}},{\text{ for }}\left|k\right|\leq 1} |
| Incomplete elliptic integral of the second kind | doubleellint_2(doublek,doublephi); |
{\displaystyle \displaystyle E(k,\phi )=\int _{0}^{\phi }{\sqrt {1-k^{2}\sin ^{2}\theta }}d\theta ,{\text{ for }}\left|k\right|\leq 1} |
| Incomplete elliptic integral of the third kind | doubleellint_3(doublek,doublenu,doublephi); |
{\displaystyle \Pi (k,\nu ,\phi )=\int _{0}^{\phi }{\frac {d\theta }{\left(1-\nu \sin ^{2}\theta \right){\sqrt {1-k^{2}\sin ^{2}\theta }}}},{\text{ for }}\left|k\right|\leq 1} |
| Exponential integral | doubleexpint(doublex); |
{\displaystyle {\mbox{E}}i(x)=-\int _{-x}^{\infty }{\frac {e^{-t}}{t}},円dt} |
| Hermite polynomials | doublehermite(unsignedintn,doublex); |
{\displaystyle H_{n}(x)=(-1)^{n}e^{x^{2}}{\frac {d^{n}}{dx^{n}}}e^{-x^{2}},円\!} |
| Hypergeometric series | doublehyperg(doublea,doubleb,doublec,doublex); |
{\displaystyle F(a,b,c,x)={\frac {\Gamma (c)}{\Gamma (a)\Gamma (b)}}\sum _{n=0}^{\infty }{\frac {\Gamma (a+n)\Gamma (b+n)}{\Gamma (c+n)}}{\frac {x^{n}}{n!}}} |
| Laguerre polynomials | doublelaguerre(unsignedintn,doublex); |
{\displaystyle L_{n}(x)={\frac {e^{x}}{n!}}{\frac {d^{n}}{dx^{n}}}\left(x^{n}e^{-x}\right),{\text{ for }}x\geq 0} |
| Legendre polynomials | doublelegendre(unsignedintl,doublex); |
{\displaystyle P_{l}(x)={1 \over 2^{l}l!}{d^{l} \over dx^{l}}(x^{2}-1)^{l},{\text{ for }}\left|x\right|\leq 1} |
| Riemann zeta function | doubleriemann_zeta(doublex); |
{\displaystyle \mathrm {Z} (x)={\begin{cases}\displaystyle \sum _{k=1}^{\infty }k^{-x},&{\text{for }}x>1\\[10pt]\displaystyle 2^{x}\pi ^{x-1}\sin \left({\frac {x\pi }{2}}\right)\Gamma (1-x)\zeta (1-x),&{\text{for }}x<1\\\end{cases}}} |
| Spherical Bessel functions of the first kind | doublesph_bessel(unsignedintn,doublex); |
{\displaystyle j_{n}(x)={\sqrt {\frac {\pi }{2x}}}J_{n+1/2}(x),{\text{ for }}x\geq 0} |
| Spherical associated Legendre functions | doublesph_legendre(unsignedintl,unsignedintm,doubletheta); |
{\displaystyle Y_{l}^{m}(\theta ,0){\text{ where }}Y_{l}^{m}(\theta ,\phi )=(-1)^{m}\left[{\frac {(2l+1)}{4\pi }}{\frac {(l-m)!}{(l+m)!}}\right]^{1 \over 2}P_{l}^{m}(\cos \theta )e^{\mathrm {i} m\phi },{\text{ for }}|m|\leq l} |
| Spherical Neumann functions | doublesph_neumann(unsignedintn,doublex); |
{\displaystyle n_{n}(x)=\left({\frac {\pi }{2x}}\right)^{\frac {1}{2}}N_{n+{\frac {1}{2}}}(x),{\text{ for }}x\geq 0} |
Each function has two additional variants. Appending the suffix ‘f’ or ‘l’ to a function name gives a function that operates on float or long double values respectively. For example:
floatsph_neumannf(unsignedintn,floatx); longdoublesph_neumannl(unsignedintn,longdoublex);
Containers
[edit ]Tuple types
[edit ]- new
<tuple>header file –tuple - based on Boost Tuple library[7]
- vaguely an extension of the standard
std::pair - fixed size collection of elements, which may be of different types
Fixed size array
[edit ]- new
<array>header file –array - taken from Boost Array library[8]
- as opposed to dynamic array types such as the standard
std::vector
Hash tables
[edit ]- new
<unordered_set>,<unordered_map>header files - they implement the
unordered_set,unordered_multiset,unordered_map, andunordered_multimapclasses, analogous toset,multiset,map, andmultimap, respectively- unfortunately,
unordered_setandunordered_multisetcannot be used with theset_union,set_intersection,set_difference,set_symmetric_difference, andincludesstandard library functions, which work forsetandmultiset
- unfortunately,
- new implementation, not derived from an existing library, not fully API compatible with existing libraries
- like all hash tables, often provide constant time lookup of elements but the worst case can be linear in the size of the container
Regular expressions
[edit ]- new
<regex>header file –regex,regex_match,regex_search,regex_replace, etc. - based on Boost RegEx library[9]
- pattern matching library
C compatibility
[edit ]C++ is designed to be compatible with the C programming language, but is not a strict superset of C due to diverging standards. TR1 attempts to reconcile some of these differences through additions to various headers in the C++ library, such as <complex>, <locale>, <cmath>, etc. These changes help to bring C++ more in line with the C99 version of the C standard (not all parts of C99 are included in TR1).
Technical Report 2
[edit ]In 2005, a request for proposals for a TR2 was made with a special interest in Unicode, XML/HTML, Networking and usability for novice programmers.TR2 call for proposals.
Some of the proposals included:
- Threads [1]
- The Asio C++ library (networking [2] [3]).
- Signals/Slots [sigc] Proposal for standardization in C++ Library TR2 [4]
- Filesystem Library Filesystem Library for TR2 – Based on the Boost Filesystem Library, for query/manipulation of paths, files and directories.
- Boost Any Library Any Library Proposal for TR2
- Lexical Conversion Library Conversion Library Proposal for TR2
- New String Algorithms Proposal for new string algorithms in TR2
- Toward a More Complete Taxonomy of Algebraic Properties for Numeric Libraries in TR2 ISO/IEC JTC1/SC22/WG21 - Papers 2008
- Adding heterogeneous comparison lookup to associative containers for TR2 [5]
After the call was issued for proposals for TR2, ISO procedures were changed, so there will not be a TR2. Instead, enhancements to C++ will be published in a number of Technical Specifications. Some of the proposals listed above are already included in the C++ standard or in draft versions of the Technical Specifications.
See also
[edit ]- C++11, standard for the C++ programming language; the library improvements were based on TR1
- C11 (C standard revision), a revision of the C standard which incorporated some features proposed in TR1
- Boost library, a large collection of portable C++ libraries, several of which were included in TR1
- Standard Template Library, part of the current C++ Standard Library
References
[edit ]- ^ "ref - 1.72.0". www.boost.org.
- ^ "Boost.SmartPtr: The Smart Pointer Library - 1.72.0". www.boost.org.
- ^ "Chapter 16. Boost.Function - 1.72.0". www.boost.org.
- ^ "Chapter 1. Boost.Bind - 1.72.0". www.boost.org.
- ^ "Chapter 1. Boost.Member Function - 1.72.0". www.boost.org.
- ^ "Chapter 1. Boost.TypeTraits - 1.37.0". www.boost.org.
- ^ "The Boost Tuple Library – Boost 1.48.0". Archived from the original on 2006年05月26日. Retrieved 2006年05月27日.
- ^ "Chapter 5. Boost.Array - 1.72.0". www.boost.org.
- ^ "Boost.Regex - 1.36.0". www.boost.org.
Sources
[edit ]- ISO/IEC JTC1/SC22/WG21 — Draft Technical Report on C++ Library Extensions (PDF) (Report). 2005年06月24日.
- ISO/IEC TR 19768:2007 — Information technology — Programming languages — Technical Report on C++ Library Extensions (Report). Nov 2007.
- Becker, Peter (2006). The C++ Standard Library Extensions: A Tutorial and Reference. Addison-Wesley Professional. ISBN 0-321-41299-0.
External links
[edit ]- Scott Meyers' Effective C++: TR1 Information – contains links to the TR1 proposal documents which provide background and rationale for the TR1 libraries.