tuple_users_guide.html 73 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Chapter&#160;1.&#160;Boost.Tuple</title>
  5. <link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="tuple_users_guide.html" title="Chapter&#160;1.&#160;Boost.Tuple">
  8. <link rel="next" href="tuple_advanced_interface.html" title="Tuple library advanced features">
  9. </head>
  10. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  11. <table cellpadding="2" width="100%"><tr>
  12. <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
  13. <td align="center"><a href="../../../../index.html">Home</a></td>
  14. <td align="center"><a href="../../../../libs/libraries.htm">Libraries</a></td>
  15. <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
  16. <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
  17. <td align="center"><a href="../../../../more/index.htm">More</a></td>
  18. </tr></table>
  19. <hr>
  20. <div class="spirit-nav"><a accesskey="n" href="tuple_advanced_interface.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a></div>
  21. <div class="chapter">
  22. <div class="titlepage"><div>
  23. <div><h2 class="title">
  24. <a name="tuple"></a>Chapter&#160;1.&#160;Boost.Tuple</h2></div>
  25. <div><p class="copyright">Copyright &#169; 2001 Jaakko J&#228;rvi</p></div>
  26. <div><div class="legalnotice">
  27. <a name="tuple.legal"></a><p>
  28. Distributed under the <a href="http://boost.org/LICENSE_1_0.txt" target="_top">Boost
  29. Software License, Version 1.0</a>.
  30. </p>
  31. </div></div>
  32. </div></div>
  33. <div class="toc">
  34. <p><b>Table of Contents</b></p>
  35. <dl class="toc">
  36. <dt><span class="article"><a href="tuple_advanced_interface.html">Tuple library advanced features</a></span></dt>
  37. <dt><span class="article"><a href="design_decisions_rationale.html">Design decisions rationale</a></span></dt>
  38. <dt><span class="section"><a href="tuple_users_guide.html#tuple.using_library">Using the Library</a></span></dt>
  39. <dt><span class="section"><a href="tuple_users_guide.html#tuple.tuple_types">Tuple Types</a></span></dt>
  40. <dt><span class="section"><a href="tuple_users_guide.html#tuple.constructing_tuples">Constructing Tuples</a></span></dt>
  41. <dt><span class="section"><a href="tuple_users_guide.html#tuple.accessing_elements">Accessing Tuple Elements</a></span></dt>
  42. <dt><span class="section"><a href="tuple_users_guide.html#tuple.construction_and_assignment">Copy Construction and
  43. Tuple Assignment</a></span></dt>
  44. <dt><span class="section"><a href="tuple_users_guide.html#tuple.relational_operators">Relational Operators</a></span></dt>
  45. <dt><span class="section"><a href="tuple_users_guide.html#tuple.tiers">Tiers</a></span></dt>
  46. <dt><span class="section"><a href="tuple_users_guide.html#tuple.streaming">Streaming</a></span></dt>
  47. <dt><span class="section"><a href="tuple_users_guide.html#tuple.performance">Performance</a></span></dt>
  48. <dt><span class="section"><a href="tuple_users_guide.html#tuple.portability">Portability</a></span></dt>
  49. <dt><span class="section"><a href="tuple_users_guide.html#tuple.more_details">More Details</a></span></dt>
  50. <dt><span class="section"><a href="tuple_users_guide.html#tuple.thanks">Acknowledgements</a></span></dt>
  51. <dt><span class="section"><a href="tuple_users_guide.html#tuple.references">References</a></span></dt>
  52. </dl>
  53. </div>
  54. <p>
  55. A tuple (or n-tuple) is a fixed size collection of elements. Pairs, triples,
  56. quadruples etc. are tuples. In a programming language, a tuple is a data object
  57. containing other objects as elements. These element objects may be of different
  58. types.
  59. </p>
  60. <p>
  61. Tuples are convenient in many circumstances. For instance, tuples make it easy
  62. to define functions that return more than one value.
  63. </p>
  64. <p>
  65. Some programming languages, such as ML, Python and Haskell, have built-in tuple
  66. constructs. Unfortunately C++ does not. To compensate for this "deficiency",
  67. the Boost Tuple Library implements a tuple construct using templates.
  68. </p>
  69. <div class="section">
  70. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  71. <a name="tuple.using_library"></a><a class="link" href="tuple_users_guide.html#tuple.using_library" title="Using the Library">Using the Library</a>
  72. </h2></div></div></div>
  73. <p>
  74. To use the library, just include:
  75. </p>
  76. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="string">"boost/tuple/tuple.hpp"</span>
  77. </pre>
  78. <p>
  79. Comparison operators can be included with:
  80. </p>
  81. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="string">"boost/tuple/tuple_comparison.hpp"</span>
  82. </pre>
  83. <p>
  84. To use tuple input and output operators,
  85. </p>
  86. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="string">"boost/tuple/tuple_io.hpp"</span>
  87. </pre>
  88. <p>
  89. Both <code class="computeroutput"><span class="identifier">tuple_io</span><span class="special">.</span><span class="identifier">hpp</span></code> and <code class="computeroutput"><span class="identifier">tuple_comparison</span><span class="special">.</span><span class="identifier">hpp</span></code> include
  90. <code class="computeroutput"><span class="identifier">tuple</span><span class="special">.</span><span class="identifier">hpp</span></code>.
  91. </p>
  92. <p>
  93. All definitions are in namespace <code class="computeroutput"><span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">tuples</span></code>,
  94. but the most common names are lifted to namespace <code class="computeroutput"><span class="special">::</span><span class="identifier">boost</span></code> with using declarations. These names
  95. are: <code class="computeroutput"><span class="identifier">tuple</span></code>, <code class="computeroutput"><span class="identifier">make_tuple</span></code>,
  96. <code class="computeroutput"><span class="identifier">tie</span></code> and <code class="computeroutput"><span class="identifier">get</span></code>.
  97. Further, <code class="computeroutput"><span class="identifier">ref</span></code> and <code class="computeroutput"><span class="identifier">cref</span></code> are defined directly under the <code class="computeroutput"><span class="special">::</span><span class="identifier">boost</span></code> namespace.
  98. </p>
  99. </div>
  100. <div class="section">
  101. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  102. <a name="tuple.tuple_types"></a><a class="link" href="tuple_users_guide.html#tuple.tuple_types" title="Tuple Types">Tuple Types</a>
  103. </h2></div></div></div>
  104. <p>
  105. A tuple type is an instantiation of the <code class="computeroutput"><span class="identifier">tuple</span></code>
  106. template. The template parameters specify the types of the tuple elements.
  107. The current version supports tuples with 0-10 elements. If necessary, the upper
  108. limit can be increased up to, say, a few dozen elements. The data element can
  109. be any C++ type. Note that <code class="computeroutput"><span class="keyword">void</span></code>
  110. and plain function types are valid C++ types, but objects of such types cannot
  111. exist. Hence, if a tuple type contains such types as elements, the tuple type
  112. can exist, but not an object of that type. There are natural limitations for
  113. element types that cannot be copied, or that are not default constructible
  114. (see <a class="link" href="tuple_users_guide.html#tuple.constructing_tuples" title="Constructing Tuples">'Constructing tuples'</a>
  115. below).
  116. </p>
  117. <p>
  118. For example, the following definitions are valid tuple instantiations (<code class="computeroutput"><span class="identifier">A</span></code>, <code class="computeroutput"><span class="identifier">B</span></code>
  119. and <code class="computeroutput"><span class="identifier">C</span></code> are some user defined
  120. classes):
  121. </p>
  122. <pre class="programlisting"><span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span>
  123. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="keyword">double</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="keyword">double</span><span class="special">,</span> <span class="keyword">double</span><span class="special">*,</span> <span class="keyword">const</span> <span class="keyword">double</span><span class="special">*&gt;</span>
  124. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span> <span class="keyword">int</span><span class="special">(*)(</span><span class="keyword">char</span><span class="special">,</span> <span class="keyword">int</span><span class="special">),</span> <span class="identifier">B</span><span class="special">(</span><span class="identifier">A</span><span class="special">::*)(</span><span class="identifier">C</span><span class="special">&amp;),</span> <span class="identifier">C</span><span class="special">&gt;</span>
  125. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">&gt;</span> <span class="special">&gt;</span>
  126. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">*,</span> <span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="identifier">A</span><span class="special">*,</span> <span class="keyword">const</span> <span class="identifier">B</span><span class="special">&amp;,</span> <span class="identifier">C</span><span class="special">&gt;,</span> <span class="keyword">bool</span><span class="special">,</span> <span class="keyword">void</span><span class="special">*&gt;</span>
  127. </pre>
  128. </div>
  129. <div class="section">
  130. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  131. <a name="tuple.constructing_tuples"></a><a class="link" href="tuple_users_guide.html#tuple.constructing_tuples" title="Constructing Tuples">Constructing Tuples</a>
  132. </h2></div></div></div>
  133. <p>
  134. The tuple constructor takes the tuple elements as arguments. For an <span class="emphasis"><em>n</em></span>-
  135. element tuple, the constructor can be invoked with <span class="emphasis"><em>k</em></span> arguments,
  136. where <code class="computeroutput"><span class="number">0</span></code> &lt;= <span class="emphasis"><em>k</em></span>
  137. &lt;= <span class="emphasis"><em>n</em></span>. For example:
  138. </p>
  139. <pre class="programlisting"><span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">double</span><span class="special">&gt;()</span>
  140. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">double</span><span class="special">&gt;(</span><span class="number">1</span><span class="special">)</span>
  141. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">double</span><span class="special">&gt;(</span><span class="number">1</span><span class="special">,</span> <span class="number">3.14</span><span class="special">)</span>
  142. </pre>
  143. <p>
  144. If no initial value for an element is provided, it is default initialized (and
  145. hence must be default initializable). For example:
  146. </p>
  147. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">X</span> <span class="special">{</span>
  148. <span class="identifier">X</span><span class="special">();</span>
  149. <span class="keyword">public</span><span class="special">:</span>
  150. <span class="identifier">X</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">);</span>
  151. <span class="special">};</span>
  152. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">X</span><span class="special">,</span><span class="identifier">X</span><span class="special">,</span><span class="identifier">X</span><span class="special">&gt;()</span> <span class="comment">// error: no default constructor for X</span>
  153. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">X</span><span class="special">,</span><span class="identifier">X</span><span class="special">,</span><span class="identifier">X</span><span class="special">&gt;(</span><span class="identifier">string</span><span class="special">(</span><span class="string">"Jaba"</span><span class="special">),</span> <span class="identifier">string</span><span class="special">(</span><span class="string">"Daba"</span><span class="special">),</span> <span class="identifier">string</span><span class="special">(</span><span class="string">"Duu"</span><span class="special">))</span> <span class="comment">// ok</span>
  154. </pre>
  155. <p>
  156. In particular, reference types do not have a default initialization:
  157. </p>
  158. <pre class="programlisting"><span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&amp;&gt;()</span> <span class="comment">// error: reference must be</span>
  159. <span class="comment">// initialized explicitly</span>
  160. <span class="keyword">double</span> <span class="identifier">d</span> <span class="special">=</span> <span class="number">5</span><span class="special">;</span>
  161. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&amp;&gt;(</span><span class="identifier">d</span><span class="special">)</span> <span class="comment">// ok</span>
  162. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&amp;&gt;(</span><span class="identifier">d</span><span class="special">+</span><span class="number">3.14</span><span class="special">)</span> <span class="comment">// error: cannot initialize</span>
  163. <span class="comment">// non-const reference with a temporary</span>
  164. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">double</span><span class="special">&amp;&gt;(</span><span class="identifier">d</span><span class="special">+</span><span class="number">3.14</span><span class="special">)</span> <span class="comment">// ok, but dangerous:</span>
  165. <span class="comment">// the element becomes a dangling reference</span>
  166. </pre>
  167. <p>
  168. Using an initial value for an element that cannot be copied, is a compile time
  169. error:
  170. </p>
  171. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">Y</span> <span class="special">{</span>
  172. <span class="identifier">Y</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Y</span><span class="special">&amp;);</span>
  173. <span class="keyword">public</span><span class="special">:</span>
  174. <span class="identifier">Y</span><span class="special">();</span>
  175. <span class="special">};</span>
  176. <span class="keyword">char</span> <span class="identifier">a</span><span class="special">[</span><span class="number">10</span><span class="special">];</span>
  177. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">[</span><span class="number">10</span><span class="special">],</span> <span class="identifier">Y</span><span class="special">&gt;(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">Y</span><span class="special">());</span> <span class="comment">// error, neither arrays nor Y can be copied</span>
  178. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">[</span><span class="number">10</span><span class="special">],</span> <span class="identifier">Y</span><span class="special">&gt;();</span> <span class="comment">// ok</span>
  179. </pre>
  180. <p>
  181. Note particularly that the following is perfectly ok:
  182. </p>
  183. <pre class="programlisting"><span class="identifier">Y</span> <span class="identifier">y</span><span class="special">;</span>
  184. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">(&amp;)[</span><span class="number">10</span><span class="special">],</span> <span class="identifier">Y</span><span class="special">&amp;&gt;(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">y</span><span class="special">);</span>
  185. </pre>
  186. <p>
  187. It is possible to come up with a tuple type that cannot be constructed. This
  188. occurs if an element that cannot be initialized has a lower index than an element
  189. that requires initialization. For example: <code class="computeroutput"><span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">[</span><span class="number">10</span><span class="special">],</span> <span class="keyword">int</span><span class="special">&amp;&gt;</span></code>.
  190. </p>
  191. <p>
  192. In sum, the tuple construction is semantically just a group of individual elementary
  193. constructions.
  194. </p>
  195. <div class="section">
  196. <div class="titlepage"><div><div><h3 class="title">
  197. <a name="tuple.constructing_tuples.make_tuple"></a><a class="link" href="tuple_users_guide.html#tuple.constructing_tuples.make_tuple" title="The make_tuple function">The <code class="computeroutput"><span class="identifier">make_tuple</span></code> function</a>
  198. </h3></div></div></div>
  199. <p>
  200. Tuples can also be constructed using the <code class="computeroutput"><span class="identifier">make_tuple</span></code>
  201. (cf. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span></code>) helper functions. This makes
  202. the construction more convenient, saving the programmer from explicitly specifying
  203. the element types:
  204. </p>
  205. <pre class="programlisting"><span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">,</span> <span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">add_multiply_divide</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">b</span><span class="special">)</span> <span class="special">{</span>
  206. <span class="keyword">return</span> <span class="identifier">make_tuple</span><span class="special">(</span><span class="identifier">a</span><span class="special">+</span><span class="identifier">b</span><span class="special">,</span> <span class="identifier">a</span><span class="special">*</span><span class="identifier">b</span><span class="special">,</span> <span class="keyword">double</span><span class="special">(</span><span class="identifier">a</span><span class="special">)/</span><span class="keyword">double</span><span class="special">(</span><span class="identifier">b</span><span class="special">));</span>
  207. <span class="special">}</span>
  208. </pre>
  209. <p>
  210. By default, the element types are deduced to the plain non-reference types.
  211. E.g.:
  212. </p>
  213. <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">A</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">B</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="special">{</span>
  214. <span class="special">...</span>
  215. <span class="identifier">make_tuple</span><span class="special">(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">);</span>
  216. </pre>
  217. <p>
  218. The <code class="computeroutput"><span class="identifier">make_tuple</span></code> invocation
  219. results in a tuple of type <code class="computeroutput"><span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span>
  220. <span class="identifier">B</span><span class="special">&gt;</span></code>.
  221. </p>
  222. <p>
  223. Sometimes the plain non-reference type is not desired, e.g. if the element
  224. type cannot be copied. Therefore, the programmer can control the type deduction
  225. and state that a reference to const or reference to non-const type should
  226. be used as the element type instead. This is accomplished with two helper
  227. template functions: <a href="../../../../libs/core/doc/html/core/ref.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span></code></a> and <a href="../../../../libs/core/doc/html/core/ref.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span></code></a>. Any argument can be wrapped
  228. with these functions to get the desired type. The mechanism does not compromise
  229. const correctness since a const object wrapped with ref results in a tuple
  230. element with const reference type (see the fifth example below). For example:
  231. </p>
  232. <pre class="programlisting"><span class="identifier">A</span> <span class="identifier">a</span><span class="special">;</span> <span class="identifier">B</span> <span class="identifier">b</span><span class="special">;</span> <span class="keyword">const</span> <span class="identifier">A</span> <span class="identifier">ca</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span>
  233. <span class="identifier">make_tuple</span><span class="special">(</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">a</span><span class="special">),</span> <span class="identifier">b</span><span class="special">);</span> <span class="comment">// creates tuple&lt;const A&amp;, B&gt;</span>
  234. <span class="identifier">make_tuple</span><span class="special">(</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">a</span><span class="special">),</span> <span class="identifier">b</span><span class="special">);</span> <span class="comment">// creates tuple&lt;A&amp;, B&gt;</span>
  235. <span class="identifier">make_tuple</span><span class="special">(</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">a</span><span class="special">),</span> <span class="identifier">cref</span><span class="special">(</span><span class="identifier">b</span><span class="special">));</span> <span class="comment">// creates tuple&lt;A&amp;, const B&amp;&gt;</span>
  236. <span class="identifier">make_tuple</span><span class="special">(</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">ca</span><span class="special">));</span> <span class="comment">// creates tuple&lt;const A&amp;&gt;</span>
  237. <span class="identifier">make_tuple</span><span class="special">(</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">ca</span><span class="special">));</span> <span class="comment">// creates tuple&lt;const A&amp;&gt;</span>
  238. </pre>
  239. <p>
  240. Array arguments to <code class="computeroutput"><span class="identifier">make_tuple</span></code>
  241. functions are deduced to reference to const types by default; there is no
  242. need to wrap them with <code class="computeroutput"><span class="identifier">cref</span></code>.
  243. For example:
  244. </p>
  245. <pre class="programlisting"><span class="identifier">make_tuple</span><span class="special">(</span><span class="string">"Donald"</span><span class="special">,</span> <span class="string">"Daisy"</span><span class="special">);</span>
  246. </pre>
  247. <p>
  248. This creates an object of type <code class="computeroutput"><span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">char</span> <span class="special">(&amp;)[</span><span class="number">7</span><span class="special">],</span> <span class="keyword">const</span>
  249. <span class="keyword">char</span> <span class="special">(&amp;)[</span><span class="number">6</span><span class="special">]&gt;</span></code> (note
  250. that the type of a string literal is an array of const characters, not <code class="computeroutput"><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span></code>). However, to get <code class="computeroutput"><span class="identifier">make_tuple</span></code>
  251. to create a tuple with an element of a non-const array type one must use
  252. the <code class="computeroutput"><span class="identifier">ref</span></code> wrapper.
  253. </p>
  254. <p>
  255. Function pointers are deduced to the plain non-reference type, that is, to
  256. plain function pointer. A tuple can also hold a reference to a function,
  257. but such a tuple cannot be constructed with <code class="computeroutput"><span class="identifier">make_tuple</span></code>
  258. (a const qualified function type would result, which is illegal):
  259. </p>
  260. <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span><span class="special">);</span>
  261. <span class="special">...</span>
  262. <span class="identifier">make_tuple</span><span class="special">(&amp;</span><span class="identifier">f</span><span class="special">);</span> <span class="comment">// tuple&lt;void (*)(int)&gt;</span>
  263. <span class="special">...</span>
  264. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">void</span> <span class="special">(&amp;)(</span><span class="keyword">int</span><span class="special">)&gt;</span> <span class="special">&gt;</span> <span class="identifier">a</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span> <span class="comment">// ok</span>
  265. <span class="identifier">make_tuple</span><span class="special">(</span><span class="identifier">f</span><span class="special">);</span> <span class="comment">// not ok</span>
  266. </pre>
  267. </div>
  268. </div>
  269. <div class="section">
  270. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  271. <a name="tuple.accessing_elements"></a><a class="link" href="tuple_users_guide.html#tuple.accessing_elements" title="Accessing Tuple Elements">Accessing Tuple Elements</a>
  272. </h2></div></div></div>
  273. <p>
  274. Tuple elements are accessed with the expression:
  275. </p>
  276. <pre class="programlisting"><span class="identifier">t</span><span class="special">.</span><span class="identifier">get</span><span class="special">&lt;</span><span class="identifier">N</span><span class="special">&gt;()</span>
  277. </pre>
  278. <p>
  279. or
  280. </p>
  281. <pre class="programlisting"><span class="identifier">get</span><span class="special">&lt;</span><span class="identifier">N</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">)</span>
  282. </pre>
  283. <p>
  284. where <code class="computeroutput"><span class="identifier">t</span></code> is a tuple object and
  285. <code class="computeroutput"><span class="identifier">N</span></code> is a constant integral expression
  286. specifying the index of the element to be accessed. Depending on whether <code class="computeroutput"><span class="identifier">t</span></code> is const or not, <code class="computeroutput"><span class="identifier">get</span></code>
  287. returns the <code class="computeroutput"><span class="identifier">N</span></code>-th element as
  288. a reference to const or non-const type. The index of the first element is
  289. <code class="computeroutput"><span class="number">0</span></code> and thus <code class="computeroutput"><span class="identifier">N</span></code>
  290. must be between <code class="computeroutput"><span class="number">0</span></code> and <span class="emphasis"><em>k</em></span><code class="computeroutput"><span class="special">-</span><span class="number">1</span></code>, where <span class="emphasis"><em>k</em></span>
  291. is the number of elements in the tuple. Violations of these constraints are
  292. detected at compile time. Examples:
  293. </p>
  294. <pre class="programlisting"><span class="keyword">double</span> <span class="identifier">d</span> <span class="special">=</span> <span class="number">2.7</span><span class="special">;</span> <span class="identifier">A</span> <span class="identifier">a</span><span class="special">;</span>
  295. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">double</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">A</span><span class="special">&amp;&gt;</span> <span class="identifier">t</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="identifier">d</span><span class="special">,</span> <span class="identifier">a</span><span class="special">);</span>
  296. <span class="keyword">const</span> <span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">double</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">A</span><span class="special">&amp;&gt;</span> <span class="identifier">ct</span> <span class="special">=</span> <span class="identifier">t</span><span class="special">;</span>
  297. <span class="special">...</span>
  298. <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">);</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">t</span><span class="special">.</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;();</span> <span class="comment">// ok</span>
  299. <span class="keyword">int</span> <span class="identifier">j</span> <span class="special">=</span> <span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span><span class="identifier">ct</span><span class="special">);</span> <span class="comment">// ok</span>
  300. <span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">)</span> <span class="special">=</span> <span class="number">5</span><span class="special">;</span> <span class="comment">// ok</span>
  301. <span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span><span class="identifier">ct</span><span class="special">)</span> <span class="special">=</span> <span class="number">5</span><span class="special">;</span> <span class="comment">// error, can't assign to const</span>
  302. <span class="special">...</span>
  303. <span class="keyword">double</span> <span class="identifier">e</span> <span class="special">=</span> <span class="identifier">get</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">);</span> <span class="comment">// ok</span>
  304. <span class="identifier">get</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">)</span> <span class="special">=</span> <span class="number">3.14</span><span class="special">;</span> <span class="comment">// ok</span>
  305. <span class="identifier">get</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">A</span><span class="special">();</span> <span class="comment">// error, can't assign to const</span>
  306. <span class="identifier">A</span> <span class="identifier">aa</span> <span class="special">=</span> <span class="identifier">get</span><span class="special">&lt;</span><span class="number">3</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">);</span> <span class="comment">// error: index out of bounds</span>
  307. <span class="special">...</span>
  308. <span class="special">++</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">);</span> <span class="comment">// ok, can be used as any variable</span>
  309. </pre>
  310. <p>
  311. <span class="emphasis"><em>[Note:</em></span> The member <code class="computeroutput"><span class="identifier">get</span></code>
  312. functions are not supported with MS Visual C++ compiler. Further, the compiler
  313. has trouble with finding the non-member <code class="computeroutput"><span class="identifier">get</span></code>
  314. functions without an explicit namespace qualifier. Hence, all <code class="computeroutput"><span class="identifier">get</span></code> calls should be qualified as <code class="computeroutput"><span class="identifier">tuples</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="identifier">N</span><span class="special">&gt;(</span><span class="identifier">a_tuple</span><span class="special">)</span></code> when writing code that should compile with
  315. MSVC++ 6.0.<span class="emphasis"><em>]</em></span>
  316. </p>
  317. </div>
  318. <div class="section">
  319. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  320. <a name="tuple.construction_and_assignment"></a><a class="link" href="tuple_users_guide.html#tuple.construction_and_assignment" title="Copy Construction and Tuple Assignment">Copy Construction and
  321. Tuple Assignment</a>
  322. </h2></div></div></div>
  323. <p>
  324. A tuple can be copy constructed from another tuple, provided that the element
  325. types are element-wise copy constructible. Analogously, a tuple can be assigned
  326. to another tuple, provided that the element types are element-wise assignable.
  327. For example:
  328. </p>
  329. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">A</span> <span class="special">{};</span>
  330. <span class="keyword">class</span> <span class="identifier">B</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">A</span> <span class="special">{};</span>
  331. <span class="keyword">struct</span> <span class="identifier">C</span> <span class="special">{</span> <span class="identifier">C</span><span class="special">();</span> <span class="identifier">C</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">B</span><span class="special">&amp;);</span> <span class="special">};</span>
  332. <span class="keyword">struct</span> <span class="identifier">D</span> <span class="special">{</span> <span class="keyword">operator</span> <span class="identifier">C</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> <span class="special">};</span>
  333. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">B</span><span class="special">*,</span> <span class="identifier">B</span><span class="special">,</span> <span class="identifier">D</span><span class="special">&gt;</span> <span class="identifier">t</span><span class="special">;</span>
  334. <span class="special">...</span>
  335. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">A</span><span class="special">*,</span> <span class="identifier">C</span><span class="special">,</span> <span class="identifier">C</span><span class="special">&gt;</span> <span class="identifier">a</span><span class="special">(</span><span class="identifier">t</span><span class="special">);</span> <span class="comment">// ok</span>
  336. <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">t</span><span class="special">;</span> <span class="comment">// ok</span>
  337. </pre>
  338. <p>
  339. In both cases, the conversions performed are:
  340. </p>
  341. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  342. <li class="listitem">
  343. <code class="computeroutput"><span class="keyword">char</span> <span class="special">-&gt;</span>
  344. <span class="keyword">int</span></code>,
  345. </li>
  346. <li class="listitem">
  347. <code class="computeroutput"><span class="identifier">B</span><span class="special">*</span>
  348. <span class="special">-&gt;</span> <span class="identifier">A</span><span class="special">*</span></code> (derived class pointer to base class pointer),
  349. </li>
  350. <li class="listitem">
  351. <code class="computeroutput"><span class="identifier">B</span> <span class="special">-&gt;</span>
  352. <span class="identifier">C</span></code> (a user defined conversion),
  353. and
  354. </li>
  355. <li class="listitem">
  356. <code class="computeroutput"><span class="identifier">D</span> <span class="special">-&gt;</span>
  357. <span class="identifier">C</span></code> (a user defined conversion).
  358. </li>
  359. </ul></div>
  360. <p>
  361. Note that assignment is also defined from <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span></code> types:
  362. </p>
  363. <pre class="programlisting"><span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">float</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="char">'a'</span><span class="special">);</span>
  364. </pre>
  365. </div>
  366. <div class="section">
  367. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  368. <a name="tuple.relational_operators"></a><a class="link" href="tuple_users_guide.html#tuple.relational_operators" title="Relational Operators">Relational Operators</a>
  369. </h2></div></div></div>
  370. <p>
  371. Tuples reduce the operators <code class="computeroutput"><span class="special">==</span></code>,
  372. <code class="computeroutput"><span class="special">!=</span></code>, <code class="computeroutput"><span class="special">&lt;</span></code>,
  373. <code class="computeroutput"><span class="special">&gt;</span></code>, <code class="computeroutput"><span class="special">&lt;=</span></code>
  374. and <code class="computeroutput"><span class="special">&gt;=</span></code> to the corresponding
  375. elementary operators. This means, that if any of these operators is defined
  376. between all elements of two tuples, then the same operator is defined between
  377. the tuples as well. The equality operators for two tuples <code class="computeroutput"><span class="identifier">a</span></code>
  378. and <code class="computeroutput"><span class="identifier">b</span></code> are defined as:
  379. </p>
  380. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  381. <li class="listitem">
  382. <code class="computeroutput"><span class="identifier">a</span> <span class="special">==</span>
  383. <span class="identifier">b</span></code> iff for each <code class="computeroutput"><span class="identifier">i</span></code>: <code class="computeroutput"><span class="identifier">a</span></code><sub>i</sub><code class="computeroutput">
  384. <span class="special">==</span> <span class="identifier">b</span></code><sub>i</sub>
  385. </li>
  386. <li class="listitem">
  387. <code class="computeroutput"><span class="identifier">a</span> <span class="special">!=</span>
  388. <span class="identifier">b</span></code> iff exists <code class="computeroutput"><span class="identifier">i</span></code>:
  389. <code class="computeroutput"><span class="identifier">a</span></code><sub>i</sub><code class="computeroutput"> <span class="special">!=</span>
  390. <span class="identifier">b</span></code><sub>i</sub>
  391. </li>
  392. </ul></div>
  393. <p>
  394. The operators <code class="computeroutput"><span class="special">&lt;</span></code>, <code class="computeroutput"><span class="special">&gt;</span></code>, <code class="computeroutput"><span class="special">&lt;=</span></code>
  395. and <code class="computeroutput"><span class="special">&gt;=</span></code> implement a lexicographical
  396. ordering.
  397. </p>
  398. <p>
  399. Note that an attempt to compare two tuples of different lengths results in
  400. a compile time error. Also, the comparison operators are <span class="emphasis"><em>"short-circuited"</em></span>:
  401. elementary comparisons start from the first elements and are performed only
  402. until the result is clear.
  403. </p>
  404. <p>
  405. Examples:
  406. </p>
  407. <pre class="programlisting"><span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">int</span><span class="special">,</span> <span class="identifier">A</span><span class="special">&gt;</span> <span class="identifier">t1</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">(</span><span class="string">"same?"</span><span class="special">),</span> <span class="number">2</span><span class="special">,</span> <span class="identifier">A</span><span class="special">());</span>
  408. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">long</span><span class="special">,</span> <span class="identifier">A</span><span class="special">&gt;</span> <span class="identifier">t2</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">(</span><span class="string">"same?"</span><span class="special">),</span> <span class="number">2</span><span class="special">,</span> <span class="identifier">A</span><span class="special">());</span>
  409. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">long</span><span class="special">,</span> <span class="identifier">A</span><span class="special">&gt;</span> <span class="identifier">t3</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">(</span><span class="string">"different"</span><span class="special">),</span> <span class="number">3</span><span class="special">,</span> <span class="identifier">A</span><span class="special">());</span>
  410. <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">A</span><span class="special">)</span> <span class="special">{</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"All the same to me..."</span><span class="special">;</span> <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> <span class="special">}</span>
  411. <span class="identifier">t1</span> <span class="special">==</span> <span class="identifier">t2</span><span class="special">;</span> <span class="comment">// true</span>
  412. <span class="identifier">t1</span> <span class="special">==</span> <span class="identifier">t3</span><span class="special">;</span> <span class="comment">// false, does not print "All the..."</span>
  413. </pre>
  414. </div>
  415. <div class="section">
  416. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  417. <a name="tuple.tiers"></a><a class="link" href="tuple_users_guide.html#tuple.tiers" title="Tiers">Tiers</a>
  418. </h2></div></div></div>
  419. <p>
  420. <span class="emphasis"><em>Tiers</em></span> are tuples, where all elements are of non-const
  421. reference types. They are constructed with a call to the <code class="computeroutput"><span class="identifier">tie</span></code>
  422. function template (cf. <code class="computeroutput"><span class="identifier">make_tuple</span></code>):
  423. </p>
  424. <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span><span class="special">;</span> <span class="keyword">char</span> <span class="identifier">c</span><span class="special">;</span> <span class="keyword">double</span> <span class="identifier">d</span><span class="special">;</span>
  425. <span class="special">...</span>
  426. <span class="identifier">tie</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">c</span><span class="special">,</span> <span class="identifier">a</span><span class="special">);</span>
  427. </pre>
  428. <p>
  429. The above <code class="computeroutput"><span class="identifier">tie</span></code> function creates
  430. a tuple of type <code class="computeroutput"><span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;,</span> <span class="keyword">char</span><span class="special">&amp;,</span> <span class="keyword">double</span><span class="special">&amp;&gt;</span></code>. The same result could be achieved
  431. with the call <code class="computeroutput"><span class="identifier">make_tuple</span><span class="special">(</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">),</span> <span class="identifier">ref</span><span class="special">(</span><span class="identifier">c</span><span class="special">),</span> <span class="identifier">ref</span><span class="special">(</span><span class="identifier">a</span><span class="special">))</span></code>.
  432. </p>
  433. <p>
  434. A tuple that contains non-const references as elements can be used to 'unpack'
  435. another tuple into variables. E.g.:
  436. </p>
  437. <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span><span class="special">;</span> <span class="keyword">char</span> <span class="identifier">c</span><span class="special">;</span> <span class="keyword">double</span> <span class="identifier">d</span><span class="special">;</span>
  438. <span class="identifier">tie</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">c</span><span class="special">,</span> <span class="identifier">d</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">make_tuple</span><span class="special">(</span><span class="number">1</span><span class="special">,</span><span class="char">'a'</span><span class="special">,</span> <span class="number">5.5</span><span class="special">);</span>
  439. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">i</span> <span class="special">&lt;&lt;</span> <span class="string">" "</span> <span class="special">&lt;&lt;</span> <span class="identifier">c</span> <span class="special">&lt;&lt;</span> <span class="string">" "</span> <span class="special">&lt;&lt;</span> <span class="identifier">d</span><span class="special">;</span>
  440. </pre>
  441. <p>
  442. This code prints <code class="computeroutput"><span class="number">1</span> <span class="identifier">a</span>
  443. <span class="number">5.5</span></code> to the standard output stream. A
  444. tuple unpacking operation like this is found for example in ML and Python.
  445. It is convenient when calling functions which return tuples.
  446. </p>
  447. <p>
  448. The tying mechanism works with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span></code> templates
  449. as well:
  450. </p>
  451. <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span><span class="special">;</span> <span class="keyword">char</span> <span class="identifier">c</span><span class="special">;</span>
  452. <span class="identifier">tie</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">c</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="char">'a'</span><span class="special">);</span>
  453. </pre>
  454. <div class="section">
  455. <div class="titlepage"><div><div><h3 class="title">
  456. <a name="tuple.tiers.ignore"></a><a class="link" href="tuple_users_guide.html#tuple.tiers.ignore" title="Ignore">Ignore</a>
  457. </h3></div></div></div>
  458. <p>
  459. There is also an object called <code class="computeroutput"><span class="identifier">ignore</span></code>
  460. which allows you to ignore an element assigned by a tuple. The idea is that
  461. a function may return a tuple, only part of which you are interested in.
  462. For example (note, that ignore is under the <code class="computeroutput"><span class="identifier">tuples</span></code>
  463. subnamespace):
  464. </p>
  465. <pre class="programlisting"><span class="keyword">char</span> <span class="identifier">c</span><span class="special">;</span>
  466. <span class="identifier">tie</span><span class="special">(</span><span class="identifier">tuples</span><span class="special">::</span><span class="identifier">ignore</span><span class="special">,</span> <span class="identifier">c</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="char">'a'</span><span class="special">);</span>
  467. </pre>
  468. </div>
  469. </div>
  470. <div class="section">
  471. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  472. <a name="tuple.streaming"></a><a class="link" href="tuple_users_guide.html#tuple.streaming" title="Streaming">Streaming</a>
  473. </h2></div></div></div>
  474. <p>
  475. The global <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;&lt;</span></code>
  476. has been overloaded for <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span></code>
  477. such that tuples are output by recursively calling <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;&lt;</span></code> for each element.
  478. </p>
  479. <p>
  480. Analogously, the global <code class="computeroutput"><span class="keyword">operator</span><span class="special">&gt;&gt;</span></code> has been overloaded to extract tuples
  481. from <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">istream</span></code> by recursively calling <code class="computeroutput"><span class="keyword">operator</span><span class="special">&gt;&gt;</span></code>
  482. for each element.
  483. </p>
  484. <p>
  485. The default delimiter between the elements is space, and the tuple is enclosed
  486. in parenthesis. For Example:
  487. </p>
  488. <pre class="programlisting"><span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">float</span><span class="special">,</span> <span class="keyword">int</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</span> <span class="identifier">a</span><span class="special">(</span><span class="number">1.0f</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">(</span><span class="string">"Howdy folks!"</span><span class="special">);</span>
  489. <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">a</span><span class="special">;</span>
  490. </pre>
  491. <p>
  492. outputs the tuple as: <code class="computeroutput"><span class="special">(</span><span class="number">1.0</span>
  493. <span class="number">2</span> <span class="identifier">Howdy</span>
  494. <span class="identifier">folks</span><span class="special">!)</span></code>
  495. </p>
  496. <p>
  497. The library defines three manipulators for changing the default behavior:
  498. </p>
  499. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  500. <li class="listitem">
  501. <code class="computeroutput"><span class="identifier">set_open</span><span class="special">(</span><span class="keyword">char</span><span class="special">)</span></code> defines
  502. the character that is output before the first element.
  503. </li>
  504. <li class="listitem">
  505. <code class="computeroutput"><span class="identifier">set_close</span><span class="special">(</span><span class="keyword">char</span><span class="special">)</span></code> defines
  506. the character that is output after the last element.
  507. </li>
  508. <li class="listitem">
  509. <code class="computeroutput"><span class="identifier">set_delimiter</span><span class="special">(</span><span class="keyword">char</span><span class="special">)</span></code> defines
  510. the delimiter character between elements.
  511. </li>
  512. </ul></div>
  513. <p>
  514. Note, that these manipulators are defined in the tuples subnamespace. For example:
  515. </p>
  516. <pre class="programlisting"><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">tuples</span><span class="special">::</span><span class="identifier">set_open</span><span class="special">(</span><span class="char">'['</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">tuples</span><span class="special">::</span><span class="identifier">set_close</span><span class="special">(</span><span class="char">']'</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">tuples</span><span class="special">::</span><span class="identifier">set_delimiter</span><span class="special">(</span><span class="char">','</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">a</span><span class="special">;</span>
  517. </pre>
  518. <p>
  519. outputs the same tuple <code class="computeroutput"><span class="identifier">a</span></code> as:
  520. <code class="computeroutput"><span class="special">[</span><span class="number">1.0</span><span class="special">,</span><span class="number">2</span><span class="special">,</span><span class="identifier">Howdy</span> <span class="identifier">folks</span><span class="special">!]</span></code>
  521. </p>
  522. <p>
  523. The same manipulators work with <code class="computeroutput"><span class="keyword">operator</span><span class="special">&gt;&gt;</span></code> and <code class="computeroutput"><span class="identifier">istream</span></code>
  524. as well. Suppose the <code class="computeroutput"><span class="identifier">cin</span></code> stream
  525. contains the following data:
  526. </p>
  527. <pre class="programlisting"><span class="special">(</span><span class="number">1</span> <span class="number">2</span> <span class="number">3</span><span class="special">)</span> <span class="special">[</span><span class="number">4</span><span class="special">:</span><span class="number">5</span><span class="special">]</span>
  528. </pre>
  529. <p>
  530. The code:
  531. </p>
  532. <pre class="programlisting"><span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">i</span><span class="special">;</span>
  533. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">j</span><span class="special">;</span>
  534. <span class="identifier">cin</span> <span class="special">&gt;&gt;</span> <span class="identifier">i</span><span class="special">;</span>
  535. <span class="identifier">cin</span> <span class="special">&gt;&gt;</span> <span class="identifier">tuples</span><span class="special">::</span><span class="identifier">set_open</span><span class="special">(</span><span class="char">'['</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="identifier">tuples</span><span class="special">::</span><span class="identifier">set_close</span><span class="special">(</span><span class="char">']'</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="identifier">tuples</span><span class="special">::</span><span class="identifier">set_delimiter</span><span class="special">(</span><span class="char">':'</span><span class="special">);</span>
  536. <span class="identifier">cin</span> <span class="special">&gt;&gt;</span> <span class="identifier">j</span><span class="special">;</span>
  537. </pre>
  538. <p>
  539. reads the data into the tuples <code class="computeroutput"><span class="identifier">i</span></code>
  540. and <code class="computeroutput"><span class="identifier">j</span></code>.
  541. </p>
  542. <p>
  543. Note that extracting tuples with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>
  544. or C-style string elements does not generally work, since the streamed tuple
  545. representation may not be unambiguously parseable.
  546. </p>
  547. </div>
  548. <div class="section">
  549. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  550. <a name="tuple.performance"></a><a class="link" href="tuple_users_guide.html#tuple.performance" title="Performance">Performance</a>
  551. </h2></div></div></div>
  552. <p>
  553. All tuple access and construction functions are small inlined one-liners. Therefore,
  554. a decent compiler can eliminate any extra cost of using tuples compared to
  555. using hand-written tuple like classes. Particularly, with a decent compiler
  556. there is no performance difference between this code:
  557. </p>
  558. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">hand_made_tuple</span> <span class="special">{</span>
  559. <span class="identifier">A</span> <span class="identifier">a</span><span class="special">;</span> <span class="identifier">B</span> <span class="identifier">b</span><span class="special">;</span> <span class="identifier">C</span> <span class="identifier">c</span><span class="special">;</span>
  560. <span class="keyword">public</span><span class="special">:</span>
  561. <span class="identifier">hand_made_tuple</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">A</span><span class="special">&amp;</span> <span class="identifier">aa</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">B</span><span class="special">&amp;</span> <span class="identifier">bb</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">C</span><span class="special">&amp;</span> <span class="identifier">cc</span><span class="special">)</span>
  562. <span class="special">:</span> <span class="identifier">a</span><span class="special">(</span><span class="identifier">aa</span><span class="special">),</span> <span class="identifier">b</span><span class="special">(</span><span class="identifier">bb</span><span class="special">),</span> <span class="identifier">c</span><span class="special">(</span><span class="identifier">cc</span><span class="special">)</span> <span class="special">{};</span>
  563. <span class="identifier">A</span><span class="special">&amp;</span> <span class="identifier">getA</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">a</span><span class="special">;</span> <span class="special">};</span>
  564. <span class="identifier">B</span><span class="special">&amp;</span> <span class="identifier">getB</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">b</span><span class="special">;</span> <span class="special">};</span>
  565. <span class="identifier">C</span><span class="special">&amp;</span> <span class="identifier">getC</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">c</span><span class="special">;</span> <span class="special">};</span>
  566. <span class="special">};</span>
  567. <span class="identifier">hand_made_tuple</span> <span class="identifier">hmt</span><span class="special">(</span><span class="identifier">A</span><span class="special">(),</span> <span class="identifier">B</span><span class="special">(),</span> <span class="identifier">C</span><span class="special">());</span>
  568. <span class="identifier">hmt</span><span class="special">.</span><span class="identifier">getA</span><span class="special">();</span> <span class="identifier">hmt</span><span class="special">.</span><span class="identifier">getB</span><span class="special">();</span> <span class="identifier">hmt</span><span class="special">.</span><span class="identifier">getC</span><span class="special">();</span>
  569. </pre>
  570. <p>
  571. and this code:
  572. </p>
  573. <pre class="programlisting"><span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">,</span> <span class="identifier">C</span><span class="special">&gt;</span> <span class="identifier">t</span><span class="special">(</span><span class="identifier">A</span><span class="special">(),</span> <span class="identifier">B</span><span class="special">(),</span> <span class="identifier">C</span><span class="special">());</span>
  574. <span class="identifier">t</span><span class="special">.</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;();</span> <span class="identifier">t</span><span class="special">.</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;();</span> <span class="identifier">t</span><span class="special">.</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;();</span>
  575. </pre>
  576. <p>
  577. Note, that there are widely used compilers (e.g. bcc 5.5.1) which fail to optimize
  578. this kind of tuple usage.
  579. </p>
  580. <p>
  581. Depending on the optimizing ability of the compiler, the tier mechanism may
  582. have a small performance penalty compared to using non-const reference parameters
  583. as a mechanism for returning multiple values from a function. For example,
  584. suppose that the following functions <code class="computeroutput"><span class="identifier">f1</span></code>
  585. and <code class="computeroutput"><span class="identifier">f2</span></code> have equivalent functionalities:
  586. </p>
  587. <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">f1</span><span class="special">(</span><span class="keyword">int</span><span class="special">&amp;,</span> <span class="keyword">double</span><span class="special">&amp;);</span>
  588. <span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">f2</span><span class="special">();</span>
  589. </pre>
  590. <p>
  591. Then, the call #1 may be slightly faster than #2 in the code below:
  592. </p>
  593. <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span><span class="special">;</span> <span class="keyword">double</span> <span class="identifier">d</span><span class="special">;</span>
  594. <span class="special">...</span>
  595. <span class="identifier">f1</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span><span class="identifier">d</span><span class="special">);</span> <span class="comment">// #1</span>
  596. <span class="identifier">tie</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span><span class="identifier">d</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">f2</span><span class="special">();</span> <span class="comment">// #2</span>
  597. </pre>
  598. <p>
  599. See [<a class="link" href="tuple_users_guide.html#publ_1">1</a>, <a class="link" href="tuple_users_guide.html#publ_2">2</a>] for
  600. more in-depth discussions about efficiency.
  601. </p>
  602. <div class="section">
  603. <div class="titlepage"><div><div><h3 class="title">
  604. <a name="tuple.performance.effect_on_compile_time"></a><a class="link" href="tuple_users_guide.html#tuple.performance.effect_on_compile_time" title="Effect on Compile Time">Effect on Compile
  605. Time</a>
  606. </h3></div></div></div>
  607. <p>
  608. Compiling tuples can be slow due to the excessive amount of template instantiations.
  609. Depending on the compiler and the tuple length, it may be more than 10 times
  610. slower to compile a tuple construct, compared to compiling an equivalent
  611. explicitly written class, such as the <code class="computeroutput"><span class="identifier">hand_made_tuple</span></code>
  612. class above. However, as a realistic program is likely to contain a lot of
  613. code in addition to tuple definitions, the difference is probably unnoticeable.
  614. Compile time increases between 5 and 10 percent were measured for programs
  615. which used tuples very frequently. With the same test programs, memory consumption
  616. of compiling increased between 22% to 27%. See [<a class="link" href="tuple_users_guide.html#publ_1">1</a>,
  617. <a class="link" href="tuple_users_guide.html#publ_2">2</a>] for details.
  618. </p>
  619. </div>
  620. </div>
  621. <div class="section">
  622. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  623. <a name="tuple.portability"></a><a class="link" href="tuple_users_guide.html#tuple.portability" title="Portability">Portability</a>
  624. </h2></div></div></div>
  625. <p>
  626. The library code is(?) standard C++ and thus the library works with a standard
  627. conforming compiler. Below is a list of compilers and known problems with each
  628. compiler:
  629. </p>
  630. <div class="informaltable"><table class="table">
  631. <colgroup>
  632. <col>
  633. <col>
  634. </colgroup>
  635. <thead><tr>
  636. <th>
  637. <p>
  638. Compiler
  639. </p>
  640. </th>
  641. <th>
  642. <p>
  643. Problems
  644. </p>
  645. </th>
  646. </tr></thead>
  647. <tbody>
  648. <tr>
  649. <td>
  650. <p>
  651. gcc 2.95
  652. </p>
  653. </td>
  654. <td>
  655. <p>
  656. -
  657. </p>
  658. </td>
  659. </tr>
  660. <tr>
  661. <td>
  662. <p>
  663. edg 2.44
  664. </p>
  665. </td>
  666. <td>
  667. <p>
  668. -
  669. </p>
  670. </td>
  671. </tr>
  672. <tr>
  673. <td>
  674. <p>
  675. Borland 5.5
  676. </p>
  677. </td>
  678. <td>
  679. <p>
  680. Can't use function pointers or member pointers as tuple elements
  681. </p>
  682. </td>
  683. </tr>
  684. <tr>
  685. <td>
  686. <p>
  687. Metrowerks 6.2
  688. </p>
  689. </td>
  690. <td>
  691. <p>
  692. Can't use <code class="computeroutput"><span class="identifier">ref</span></code> and
  693. <code class="computeroutput"><span class="identifier">cref</span></code> wrappers
  694. </p>
  695. </td>
  696. </tr>
  697. <tr>
  698. <td>
  699. <p>
  700. MS Visual C++
  701. </p>
  702. </td>
  703. <td>
  704. <p>
  705. No reference elements (<code class="computeroutput"><span class="identifier">tie</span></code>
  706. still works). Can't use <code class="computeroutput"><span class="identifier">ref</span></code>
  707. and <code class="computeroutput"><span class="identifier">cref</span></code> wrappers
  708. </p>
  709. </td>
  710. </tr>
  711. </tbody>
  712. </table></div>
  713. </div>
  714. <div class="section">
  715. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  716. <a name="tuple.more_details"></a><a class="link" href="tuple_users_guide.html#tuple.more_details" title="More Details">More Details</a>
  717. </h2></div></div></div>
  718. <p>
  719. <a class="link" href="tuple_advanced_interface.html" title="Tuple library advanced features">Advanced features</a> (describes
  720. some metafunctions etc.).
  721. </p>
  722. <p>
  723. <a class="link" href="design_decisions_rationale.html" title="Design decisions rationale">Rationale behind some design/implementation
  724. decisions</a>.
  725. </p>
  726. </div>
  727. <div class="section">
  728. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  729. <a name="tuple.thanks"></a><a class="link" href="tuple_users_guide.html#tuple.thanks" title="Acknowledgements">Acknowledgements</a>
  730. </h2></div></div></div>
  731. <p>
  732. Gary Powell has been an indispensable helping hand. In particular, stream manipulators
  733. for tuples were his idea. Doug Gregor came up with a working version for MSVC,
  734. David Abrahams found a way to get rid of most of the restrictions for compilers
  735. not supporting partial specialization. Thanks to Jeremy Siek, William Kempf
  736. and Jens Maurer for their help and suggestions. The comments by Vesa Karvonen,
  737. John Max Skaller, Ed Brey, Beman Dawes, David Abrahams and Hartmut Kaiser helped
  738. to improve the library. The idea for the <code class="computeroutput"><span class="identifier">tie</span></code>
  739. mechanism came from an old usenet article by Ian McCulloch, where he proposed
  740. something similar for <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span></code>s.
  741. </p>
  742. </div>
  743. <div class="section">
  744. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  745. <a name="tuple.references"></a><a class="link" href="tuple_users_guide.html#tuple.references" title="References">References</a>
  746. </h2></div></div></div>
  747. <p>
  748. <a name="publ_1"></a>[1] J&#228;rvi J.: <span class="emphasis"><em>Tuples and multiple return
  749. values in C++</em></span>, TUCS Technical Report No 249, 1999.
  750. </p>
  751. <p>
  752. <a name="publ_2"></a>[2] J&#228;rvi J.: <span class="emphasis"><em>ML-Style Tuple Assignment
  753. in Standard C++ - Extending the Multiple Return Value Formalism</em></span>,
  754. TUCS Technical Report No 267, 1999.
  755. </p>
  756. <p>
  757. <a name="publ_3"></a>[3] J&#228;rvi J.: <span class="emphasis"><em>Tuple Types and Multiple
  758. Return Values</em></span>, C/C++ Users Journal, August 2001.
  759. </p>
  760. </div>
  761. </div>
  762. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  763. <td align="left"><p><small>Last revised: December 10, 2019 at 00:21:48 GMT</small></p></td>
  764. <td align="right"><div class="copyright-footer"></div></td>
  765. </tr></table>
  766. <hr>
  767. <div class="spirit-nav"><a accesskey="n" href="tuple_advanced_interface.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a></div>
  768. </body>
  769. </html>