C++ Technical Report 1
C++ Technical Report 1 (TR1) is the common name for ISO/IEC TR 19768, C++ Library Extensions, which was a document proposing 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 current 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.
Contents |
Overview [edit]
Compilers needed not include the TR1 components to be conforming to the C++ standard, because TR1 proposals were not part of the standard itself, but only a set of possible additions that were still to be ratified. However, most of it was available from Boost, and several compiler/library distributors implemented all or part of the components. TR1 was not a complete list of additions to the library that were going to appear in the next standard, C++11. For example, C++11 includes 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.
There is also a second technical report, C++ Technical Report 2, planned for publishing after C++11 [1].
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> 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 }
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.
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 [2].
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 | double assoc_laguerre( unsigned n, unsigned m, double x ) ; | ![]() |
| Associated Legendre polynomials | double assoc_legendre( unsigned l, unsigned m, double x ) ; | ![]() |
| Beta function | double beta( double x, double y ) ; | ![]() |
| Complete elliptic integral of the first kind | double comp_ellint_1( double k ) ; | ![]() |
| Complete elliptic integral of the second kind | double comp_ellint_2( double k ) ; | ![]() |
| Complete elliptic integral of the third kind | double comp_ellint_3( double k, double nu ) ; | ![]() |
| Confluent hypergeometric functions | double conf_hyperg( double a, double c, double x ) ; | ![]() |
| Regular modified cylindrical Bessel functions | double cyl_bessel_i( double nu, double x ) ; | ![]() |
| Cylindrical Bessel functions of the first kind | double cyl_bessel_j( double nu, double x ) ; | ![]() |
| Irregular modified cylindrical Bessel functions | double cyl_bessel_k( double nu, double x ) ; | ![]() |
| Cylindrical Neumann functions | double cyl_neumann( double nu, double x ) ; | ![]() |
| Incomplete elliptic integral of the first kind | double ellint_1( double k, double phi ) ; | ![]() |
| Incomplete elliptic integral of the second kind | double ellint_2( double k, double phi ) ; | ![]() |
| Incomplete elliptic integral of the third kind | double ellint_3( double k, double nu, double phi ) ; | ![]() |
| Exponential integral | double expint( double x ) ; | ![]() |
| Hermite polynomials | double hermite( unsigned n, double x ) ; | ![]() |
| Hypergeometric series | double hyperg( double a, double b, double c, double x ) ; | ![]() |
| Laguerre polynomials | double laguerre( unsigned n, double x ) ; | ![]() |
| Legendre polynomials | double legendre( unsigned l, double x ) ; | ![]() |
| Riemann zeta function | double riemann_zeta( double x ) ; | ![]() |
| Spherical Bessel functions of the first kind | double sph_bessel( unsigned n, double x ) ; | ![]() |
| Spherical associated Legendre functions | double sph_legendre( unsigned l, unsigned m, double theta ) ; | ![]() |
| Spherical Neumann functions | double sph_neumann( unsigned n, double x ) ; | ![]() |
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:
float sph_neumannf( unsigned n, float x ) ; long double sph_neumannl( unsigned n, long double x ) ;
Containers [edit]
Tuple types [edit]
- new
<tuple>header file -tuple - based on Boost Tuple library [6]
- 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 [7]
- 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 [8]
- 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.[3].
Some of the proposals include:
- Threads [4]
- The Asio C++ library (networking [5][6]).
- Signals/Slots [7][8]
- Filesystem Library [9] - Based on the Boost Filesystem Library, for query/manipulation of paths, files and directories.
- Boost Any Library [10]
- Lexical Conversion Library [11]
- New String Algorithms [12]
- Toward a More Complete Taxonomy of Algebraic Properties for Numeric Libraries in TR2 [13]
- Adding heterogeneous comparison lookup to associative containers for TR2 [14]
See also [edit]
- C++11, the most recent standard for the C++ programming language; the library improvements were based on TR1
- C11 (C standard revision), the most recent standard for the C programming language
- 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
Notes [edit]
- ^ Chapter 22. Boost.Ref - Boost 1.48.0
- ^ Smart Pointers - Boost 1.48.0
- ^ Chapter 9. Boost.Function - Boost 1.48.0
- ^ Boost: bind.hpp documentation - Boost 1.48.0
- ^ Boost: mem_fn.hpp documentation - Boost 1.48.0
- ^ The Boost Tuple Library - Boost 1.48.0
- ^ Chapter 3. Boost.Array - Boost 1.48.0
- ^ Boost.Regex - Boost 1.36.0
References [edit]
- ISO/IEC JTC1/SC22/WG21 (2005-06-24). Draft Technical Report on C++ Library Extensions (PDF).
- "ISO/IEC TR 19768: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.









![\begin{align}
K_\nu(x) & = \textstyle\frac{\pi}{2} i^{\nu+1} \big(J_\nu(ix) + i N_\nu(ix)\big) \\
& = \begin{cases}
\displaystyle \frac{I_{-\nu}(x) - I_\nu(x)}{\sin \nu\pi}, & \text{for } x \ge 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{align}](http://upload.wikimedia.org/math/a/f/e/afe1bce7fc2d8f4c634b8b8814feaf59.png)
![N_\nu(x) = \begin{cases}
\displaystyle \frac{J_\nu(x)\cos \nu\pi - J_{-\nu}(x)}{\sin \nu\pi}, & \text{for } x \ge 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}](http://upload.wikimedia.org/math/8/e/3/8e366ab40889bc13f751769309f557ce.png)








![\Zeta(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}](http://upload.wikimedia.org/math/0/7/7/0770c3b962273c9fc126a401e2bf696a.png)

![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](http://upload.wikimedia.org/math/d/a/2/da20cfbc07f598887d8bf16f27918824.png)
