tuple_advanced_interface.html 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Tuple library advanced features</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="up" href="tuple_users_guide.html" title="Chapter&#160;1.&#160;Boost.Tuple">
  9. <link rel="prev" href="tuple_users_guide.html" title="Chapter&#160;1.&#160;Boost.Tuple">
  10. <link rel="next" href="design_decisions_rationale.html" title="Design decisions rationale">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr>
  14. <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
  15. <td align="center"><a href="../../../../index.html">Home</a></td>
  16. <td align="center"><a href="../../../../libs/libraries.htm">Libraries</a></td>
  17. <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
  18. <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
  19. <td align="center"><a href="../../../../more/index.htm">More</a></td>
  20. </tr></table>
  21. <hr>
  22. <div class="spirit-nav">
  23. <a accesskey="p" href="tuple_users_guide.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="tuple_users_guide.html"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="tuple_users_guide.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="design_decisions_rationale.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="article">
  26. <div class="titlepage">
  27. <div>
  28. <div><h2 class="title">
  29. <a name="tuple_advanced_interface"></a>Tuple library advanced features</h2></div>
  30. <div><p class="copyright">Copyright &#169; 2001 Jaakko J&#228;rvi</p></div>
  31. <div><div class="legalnotice">
  32. <a name="tuple_advanced_interface.legal"></a><p>
  33. Distributed under the <a href="http://boost.org/LICENSE_1_0.txt" target="_top">Boost
  34. Software License, Version 1.0</a>.
  35. </p>
  36. </div></div>
  37. </div>
  38. <hr>
  39. </div>
  40. <div class="toc">
  41. <p><b>Table of Contents</b></p>
  42. <dl class="toc">
  43. <dt><span class="section"><a href="tuple_advanced_interface.html#tuple_advanced_interface.metafunctions_for_tuple_types">Metafunctions
  44. for tuple types</a></span></dt>
  45. <dt><span class="section"><a href="tuple_advanced_interface.html#tuple_advanced_interface.cons_lists">Cons lists</a></span></dt>
  46. <dt><span class="section"><a href="tuple_advanced_interface.html#tuple_advanced_interface.traits_classes_for_tuple_element">Traits
  47. classes for tuple element types</a></span></dt>
  48. </dl>
  49. </div>
  50. <p>
  51. The advanced features described in this document are all under namespace <code class="computeroutput"><span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">tuples</span></code>
  52. </p>
  53. <div class="section">
  54. <div class="titlepage"><div><div><h3 class="title">
  55. <a name="tuple_advanced_interface.metafunctions_for_tuple_types"></a><a class="link" href="tuple_advanced_interface.html#tuple_advanced_interface.metafunctions_for_tuple_types" title="Metafunctions for tuple types">Metafunctions
  56. for tuple types</a>
  57. </h3></div></div></div>
  58. <p>
  59. Suppose <code class="computeroutput"><span class="identifier">T</span></code> is a tuple type,
  60. and <code class="computeroutput"><span class="identifier">N</span></code> is a constant integral
  61. expression.
  62. </p>
  63. <pre class="programlisting"><span class="identifier">element</span><span class="special">&lt;</span><span class="identifier">N</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span>
  64. </pre>
  65. <p>
  66. gives the type of the <code class="computeroutput"><span class="identifier">N</span></code>-th
  67. element in the tuple type <code class="computeroutput"><span class="identifier">T</span></code>.
  68. If <code class="computeroutput"><span class="identifier">T</span></code> is <code class="computeroutput"><span class="keyword">const</span></code>,
  69. the resulting type is <code class="computeroutput"><span class="keyword">const</span></code>
  70. qualified as well. Note that the constness of <code class="computeroutput"><span class="identifier">T</span></code>
  71. does not affect reference type elements.
  72. </p>
  73. <pre class="programlisting"><span class="identifier">length</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span>
  74. </pre>
  75. <p>
  76. gives the length of the tuple type <code class="computeroutput"><span class="identifier">T</span></code>.
  77. </p>
  78. </div>
  79. <div class="section">
  80. <div class="titlepage"><div><div><h3 class="title">
  81. <a name="tuple_advanced_interface.cons_lists"></a><a class="link" href="tuple_advanced_interface.html#tuple_advanced_interface.cons_lists" title="Cons lists">Cons lists</a>
  82. </h3></div></div></div>
  83. <p>
  84. Tuples are internally represented as <span class="emphasis"><em>cons lists</em></span>. For
  85. example, the tuple
  86. </p>
  87. <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">,</span> <span class="identifier">D</span><span class="special">&gt;</span>
  88. </pre>
  89. <p>
  90. inherits from the type
  91. </p>
  92. <pre class="programlisting"><span class="identifier">cons</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">cons</span><span class="special">&lt;</span><span class="identifier">B</span><span class="special">,</span> <span class="identifier">cons</span><span class="special">&lt;</span><span class="identifier">C</span><span class="special">,</span> <span class="identifier">cons</span><span class="special">&lt;</span><span class="identifier">D</span><span class="special">,</span> <span class="identifier">null_type</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;</span>
  93. </pre>
  94. <p>
  95. The tuple template provides the typedef inherited to access the cons list
  96. representation. E.g.: <code class="computeroutput"><span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;::</span><span class="identifier">inherited</span></code> is the type <code class="computeroutput"><span class="identifier">cons</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span>
  97. <span class="identifier">null_type</span><span class="special">&gt;</span></code>.
  98. </p>
  99. <div class="section">
  100. <div class="titlepage"><div><div><h4 class="title">
  101. <a name="tuple_advanced_interface.cons_lists.empty_tuple"></a><a class="link" href="tuple_advanced_interface.html#tuple_advanced_interface.cons_lists.empty_tuple" title="Empty tuple">Empty
  102. tuple</a>
  103. </h4></div></div></div>
  104. <p>
  105. The internal representation of the empty tuple <code class="computeroutput"><span class="identifier">tuple</span><span class="special">&lt;&gt;</span></code> is <code class="computeroutput"><span class="identifier">null_type</span></code>.
  106. </p>
  107. </div>
  108. <div class="section">
  109. <div class="titlepage"><div><div><h4 class="title">
  110. <a name="tuple_advanced_interface.cons_lists.head_and_tail"></a><a class="link" href="tuple_advanced_interface.html#tuple_advanced_interface.cons_lists.head_and_tail" title="Head and tail">Head
  111. and tail</a>
  112. </h4></div></div></div>
  113. <p>
  114. Both tuple template and the cons templates provide the typedefs <code class="computeroutput"><span class="identifier">head_type</span></code> and <code class="computeroutput"><span class="identifier">tail_type</span></code>.
  115. The <code class="computeroutput"><span class="identifier">head_type</span></code> typedef gives
  116. the type of the first element of the tuple (or the cons list). The <code class="computeroutput"><span class="identifier">tail_type</span></code> typedef gives the remaining
  117. cons list after removing the first element. The head element is stored
  118. in the member variable <code class="computeroutput"><span class="identifier">head</span></code>
  119. and the tail list in the member variable <code class="computeroutput"><span class="identifier">tail</span></code>.
  120. Cons lists provide the member function <code class="computeroutput"><span class="identifier">get_head</span><span class="special">()</span></code> for getting a reference to the head of
  121. a cons list, and <code class="computeroutput"><span class="identifier">get_tail</span><span class="special">()</span></code> for getting a reference to the tail.
  122. There are const and non-const versions of both functions.
  123. </p>
  124. <p>
  125. Note that in a one element tuple, <code class="computeroutput"><span class="identifier">tail_type</span></code>
  126. equals <code class="computeroutput"><span class="identifier">null_type</span></code> and the
  127. <code class="computeroutput"><span class="identifier">get_tail</span><span class="special">()</span></code>
  128. function returns an object of type <code class="computeroutput"><span class="identifier">null_type</span></code>.
  129. </p>
  130. <p>
  131. The empty tuple (<code class="computeroutput"><span class="identifier">null_type</span></code>)
  132. has no head or tail, hence the <code class="computeroutput"><span class="identifier">get_head</span></code>
  133. and <code class="computeroutput"><span class="identifier">get_tail</span></code> functions
  134. are not provided.
  135. </p>
  136. <p>
  137. Treating tuples as cons lists gives a convenient means to define generic
  138. functions to manipulate tuples. For example, the following pair of function
  139. templates assign <code class="computeroutput"><span class="number">0</span></code> to each
  140. element of a tuple (obviously, the assignments must be valid operations
  141. for the element types):
  142. </p>
  143. <pre class="programlisting"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">set_to_zero</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">null_type</span><span class="special">&amp;)</span> <span class="special">{};</span>
  144. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">H</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
  145. <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">set_to_zero</span><span class="special">(</span><span class="identifier">cons</span><span class="special">&lt;</span><span class="identifier">H</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">get_head</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">set_to_zero</span><span class="special">(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">get_tail</span><span class="special">());</span> <span class="special">}</span>
  146. </pre>
  147. </div>
  148. <div class="section">
  149. <div class="titlepage"><div><div><h4 class="title">
  150. <a name="tuple_advanced_interface.cons_lists.constructing_cons_lists"></a><a class="link" href="tuple_advanced_interface.html#tuple_advanced_interface.cons_lists.constructing_cons_lists" title="Constructing cons lists">Constructing
  151. cons lists</a>
  152. </h4></div></div></div>
  153. <p>
  154. A cons list can be default constructed provided that all its elements can
  155. be default constructed.
  156. </p>
  157. <p>
  158. A cons list can be constructed from its head and tail. The prototype of
  159. the constructor is:
  160. </p>
  161. <pre class="programlisting"><span class="identifier">cons</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">access_traits</span><span class="special">&lt;</span><span class="identifier">head_type</span><span class="special">&gt;::</span><span class="identifier">parameter_type</span> <span class="identifier">h</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">tail_type</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">)</span>
  162. </pre>
  163. <p>
  164. The traits template for the head parameter selects correct parameter types
  165. for different kinds of element types (for reference elements the parameter
  166. type equals the element type, for non-reference types the parameter type
  167. is a reference to const non-volatile element type).
  168. </p>
  169. <p>
  170. For a one-element cons list the tail argument (<code class="computeroutput"><span class="identifier">null_type</span></code>)
  171. can be omitted.
  172. </p>
  173. </div>
  174. </div>
  175. <div class="section">
  176. <div class="titlepage"><div><div><h3 class="title">
  177. <a name="tuple_advanced_interface.traits_classes_for_tuple_element"></a><a class="link" href="tuple_advanced_interface.html#tuple_advanced_interface.traits_classes_for_tuple_element" title="Traits classes for tuple element types">Traits
  178. classes for tuple element types</a>
  179. </h3></div></div></div>
  180. <div class="section">
  181. <div class="titlepage"><div><div><h4 class="title">
  182. <a name="tuple_advanced_interface.traits_classes_for_tuple_element.access_traits"></a><a class="link" href="tuple_advanced_interface.html#tuple_advanced_interface.traits_classes_for_tuple_element.access_traits" title="access_traits">access_traits</a>
  183. </h4></div></div></div>
  184. <p>
  185. The template <code class="computeroutput"><span class="identifier">access_traits</span></code>
  186. defines three type functions. Let <code class="computeroutput"><span class="identifier">T</span></code>
  187. be a type of an element in a tuple:
  188. </p>
  189. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  190. <li class="listitem">
  191. <code class="computeroutput"><span class="identifier">access_traits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">non_const_type</span></code> maps <code class="computeroutput"><span class="identifier">T</span></code> to the return type of the no n-const
  192. access functions (nonmember and member <code class="computeroutput"><span class="identifier">get</span></code>
  193. functions, and the <code class="computeroutput"><span class="identifier">get_head</span></code>
  194. function).
  195. </li>
  196. <li class="listitem">
  197. <code class="computeroutput"><span class="identifier">access_traits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">const_type</span></code> maps <code class="computeroutput"><span class="identifier">T</span></code>
  198. to the return type of the const access functions.
  199. </li>
  200. <li class="listitem">
  201. <code class="computeroutput"><span class="identifier">access_traits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">parameter_type</span></code> maps <code class="computeroutput"><span class="identifier">T</span></code> to the parameter type of the tuple
  202. constructor.
  203. </li>
  204. </ul></div>
  205. </div>
  206. <div class="section">
  207. <div class="titlepage"><div><div><h4 class="title">
  208. <a name="tuple_advanced_interface.traits_classes_for_tuple_element.make_tuple_traits"></a><a class="link" href="tuple_advanced_interface.html#tuple_advanced_interface.traits_classes_for_tuple_element.make_tuple_traits" title="make_tuple_traits">make_tuple_traits</a>
  209. </h4></div></div></div>
  210. <p>
  211. The element types of the tuples that are created with the <code class="computeroutput"><span class="identifier">make_tuple</span></code> functions are computed with
  212. the type function <code class="computeroutput"><span class="identifier">make_tuple_traits</span></code>.
  213. The type function call <code class="computeroutput"><span class="identifier">make_tuple_traits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span></code>
  214. implements the following type mapping:
  215. </p>
  216. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  217. <li class="listitem">
  218. <span class="emphasis"><em>any reference type</em></span> -&gt; <span class="emphasis"><em>compile time
  219. error</em></span>
  220. </li>
  221. <li class="listitem">
  222. <span class="emphasis"><em>any array type</em></span> -&gt; <span class="emphasis"><em>constant reference
  223. to the array type</em></span>
  224. </li>
  225. <li class="listitem">
  226. <code class="computeroutput"><span class="identifier">reference_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
  227. -&gt; <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span></code>
  228. </li>
  229. <li class="listitem">
  230. <code class="computeroutput"><span class="identifier">T</span></code> -&gt; <code class="computeroutput"><span class="identifier">T</span></code>
  231. </li>
  232. </ul></div>
  233. <p>
  234. Objects of type <code class="computeroutput"><span class="identifier">reference_wrapper</span></code>
  235. are created with the <code class="computeroutput"><span class="identifier">ref</span></code>
  236. and <code class="computeroutput"><span class="identifier">cref</span></code> functions (see
  237. <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>).
  238. </p>
  239. <p>
  240. Reference wrappers were originally part of the tuple library, but they
  241. are now a general utility of boost. The <code class="computeroutput"><span class="identifier">reference_wrapper</span></code>
  242. template and the <code class="computeroutput"><span class="identifier">ref</span></code> and
  243. <code class="computeroutput"><span class="identifier">cref</span></code> functions are defined
  244. in a separate file <a href="../../../../libs/core/doc/html/core/ref.html" target="_top"><code class="computeroutput"><span class="identifier">ref</span><span class="special">.</span><span class="identifier">hpp</span></code></a> in the main boost include
  245. directory; and directly in the <code class="computeroutput"><span class="identifier">boost</span></code>
  246. namespace.
  247. </p>
  248. </div>
  249. </div>
  250. </div>
  251. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  252. <td align="left"><p><small>Last revised: December 10, 2019 at 00:21:48 GMT</small></p></td>
  253. <td align="right"><div class="copyright-footer">Copyright &#169; 2001 Jaakko J&#228;rvi<p>
  254. Distributed under the <a href="http://boost.org/LICENSE_1_0.txt" target="_top">Boost
  255. Software License, Version 1.0</a>.
  256. </p>
  257. </div></td>
  258. </tr></table>
  259. <hr>
  260. <div class="spirit-nav">
  261. <a accesskey="p" href="tuple_users_guide.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="tuple_users_guide.html"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="tuple_users_guide.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="design_decisions_rationale.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
  262. </div>
  263. </body>
  264. </html>