forked from boostorg/tuple
135 lines
5.8 KiB
HTML
135 lines
5.8 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
<html>
|
|
<head>
|
|
<title>Tuple library advanced features</title>
|
|
</head>
|
|
|
|
<body bgcolor="#FFFFFF" text="#000000">
|
|
|
|
<IMG SRC="../../../boost.png"
|
|
ALT="C++ Boost" width="277" height="86">
|
|
|
|
<h1>Tuple library advanced features</h1>
|
|
|
|
The advanced features described in this document are all under namespace <code>::boost::tuples</code>
|
|
|
|
<h2>Metafunctions for tuple types</h2>
|
|
<p>
|
|
Suppose <code>T</code> is a tuple type, and <code>N</code> is a constant integral expression.</p>
|
|
|
|
<pre><code>element<N, T>::type</code></pre>
|
|
|
|
<p>gives the type of the <code>N</code>th element in the tuple type <code>T</code>. If <code>T</code> is const, the resulting type is const qualified as well.
|
|
Note that the constness of <code>T</code> does not affect reference type
|
|
elements.
|
|
</p>
|
|
|
|
<pre><code>length<T>::value</code></pre>
|
|
|
|
<p>gives the length of the tuple type <code>T</code>.
|
|
</p>
|
|
|
|
<h2>Cons lists</h2>
|
|
|
|
<p>
|
|
Tuples are internally represented as <i>cons lists</i>.
|
|
For example, the tuple </p>
|
|
|
|
<pre><code>tuple<A, B, C, D></code></pre>
|
|
|
|
<p>inherits from the type</p>
|
|
<pre><code>cons<A, cons<B, cons<C, cons<D, null_type> > > >
|
|
</code></pre>
|
|
|
|
<p>The tuple template provides the typedef <code>inherited</code> to access the cons list representation. E.g.:
|
|
<code>tuple<A>::inherited</code> is the type <code>cons<A, null_type></code>.
|
|
</p>
|
|
|
|
<h4>Empty tuple</h4>
|
|
<p>
|
|
The internal representation of the empty tuple <code>tuple<></code> is <code>null_type</code>.
|
|
</p>
|
|
|
|
<h4>Head and tail</h4>
|
|
<p>
|
|
Both tuple template and the cons templates provide the typedefs <code>head_type</code> and <code>tail_type</code>.
|
|
The <code>head_type</code> typedef gives the type of the first element of the tuple (or the cons list).
|
|
The
|
|
<code>tail_type</code> typedef gives the remaining cons list after removing the first element.
|
|
The head element is stored in the member variable <code>head</code> and the tail list in the member variable <code>tail</code>.
|
|
Cons lists provide the member function <code>get_head()</code> for getting a reference to the head of a cons list, and <code>get_tail()</code> for getting a reference to the tail.
|
|
There are const and non-const versions of both functions.
|
|
</p>
|
|
<p>
|
|
Note that in a one element tuple, <code>tail_type</code> equals <code>null_type</code> and the <code>get_tail()</code> function returns an object of type <code>null_type</code>.
|
|
</p>
|
|
<p>
|
|
The empty tuple (<code>null_type</code>) has no head or tail, hence the <code>get_head</code> and <code>get_tail</code> functions are not provided.
|
|
</p>
|
|
|
|
<p>
|
|
Treating tuples as cons lists gives a convenient means to define generic functions to manipulate tuples. For example, the following pair of function templates assign 0 to each element of a tuple (obviously, the assignments must be valid operations for the element types):
|
|
|
|
<pre><code>inline void set_to_zero(const null_type&) {};
|
|
|
|
template <class H, class T>
|
|
inline void set_to_zero(cons<H, T>& x) { x.get_head() = 0; set_to_zero(x.get_tail()); }
|
|
</code></pre>
|
|
<p>
|
|
|
|
<h4>Constructing cons lists</h4>
|
|
|
|
<p>
|
|
A cons list can be default constructed provided that all its elements can be default constructed.
|
|
</p>
|
|
<p>
|
|
A cons list can be constructed from its head and tail. The prototype of the constructor is:</p>
|
|
<pre><code>cons(typename access_traits<head_type>::parameter_type h,
|
|
const tail_type& t)
|
|
</code></pre>
|
|
<p>The traits template for the head parameter selects correct parameter types for different kinds of element types (for reference elements the parameter type equals the element type, for non-reference types the parameter type is a reference to const non-volatile element type).
|
|
</p>
|
|
<p>
|
|
For a one-element cons list the tail argument (<code>null_type</code>) can be omitted.
|
|
</p>
|
|
|
|
|
|
<h2>Traits classes for tuple element types</h2>
|
|
|
|
<h4><code>access_traits</code></h4>
|
|
<p>
|
|
The template <code>access_traits</code> defines three type functions. Let <code>T</code> be a type of an element in a tuple:</p>
|
|
<ol>
|
|
<li><code>access_traits<T>::non_const_type</code> maps <code>T</code> to the return type of the non-const access functions (nonmember and member <code>get</code> functions, and the <code>get_head</code> function).</li>
|
|
<li><code>access_traits<T>::const_type</code> maps <code>T</code> to the return type of the const access functions.</li>
|
|
<li><code>access_traits<T>::parameter_type</code> maps <code>T</code> to the parameter type of the tuple constructor.</li>
|
|
</ol>
|
|
<h4><code>make_tuple_traits</code></h4>
|
|
|
|
<p>The element types of the tuples that are created with the <code>make_tuple</code> functions are computed with the type function <code>make_tuple_traits</code>.
|
|
The type function call <code>make_tuple_traits<T>::type</code> implements the following type mapping:</p>
|
|
<ul>
|
|
<li><i>any reference type</i> -> <i>compile time error</i>
|
|
</li>
|
|
<li><i>any array type</i> -> <i>constant reference to the array type</i>
|
|
</li>
|
|
<li><code>reference_wrapper<T></code> -> <code>T&</code>
|
|
</li>
|
|
<li><code>T</code> -> <code>T</code>
|
|
</li>
|
|
</ul>
|
|
|
|
<p>Objects of type <code>reference_wrapper</code> are created with the <code>ref</code> and <code>cref</code> functions (see <A href="tuple_users_guide.html#make_tuple">The <code>make_tuple</code> function</A>.)
|
|
</p>
|
|
|
|
<p>Reference wrappers were originally part of the tuple library, but they are now a general utility of boost.
|
|
The <code>reference_wrapper</code> template and the <code>ref</code> and <code>cref</code> functions are defined in a separate file <code>ref.hpp</code> in the main boost include directory; and directly in the <code>boost</code> namespace.
|
|
</p>
|
|
|
|
<A href="tuple_users_guide.html">Back to the user's guide</A>
|
|
<hr>
|
|
|
|
<p>© Copyright Jaakko Järvi 2001.</p>
|
|
</body>
|
|
</html>
|