quick_start.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Quick Start</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="../index.html" title="Boost.Optional">
  8. <link rel="up" href="../index.html" title="Boost.Optional">
  9. <link rel="prev" href="../index.html" title="Boost.Optional">
  10. <link rel="next" href="quick_start/optional_automatic_variables.html" title="Optional automatic variables">
  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="../index.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="quick_start/optional_automatic_variables.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="section">
  26. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  27. <a name="boost_optional.quick_start"></a><a class="link" href="quick_start.html" title="Quick Start">Quick Start</a>
  28. </h2></div></div></div>
  29. <div class="toc"><dl class="toc">
  30. <dt><span class="section"><a href="quick_start.html#boost_optional.quick_start.optional_return_values">Optional
  31. return values</a></span></dt>
  32. <dt><span class="section"><a href="quick_start/optional_automatic_variables.html">Optional
  33. automatic variables</a></span></dt>
  34. <dt><span class="section"><a href="quick_start/optional_data_members.html">Optional
  35. data members</a></span></dt>
  36. <dt><span class="section"><a href="quick_start/bypassing_unnecessary_default_construction.html">Bypassing
  37. unnecessary default construction</a></span></dt>
  38. <dt><span class="section"><a href="quick_start/storage_in_containers.html">Storage
  39. in containers</a></span></dt>
  40. </dl></div>
  41. <div class="section">
  42. <div class="titlepage"><div><div><h3 class="title">
  43. <a name="boost_optional.quick_start.optional_return_values"></a><a class="link" href="quick_start.html#boost_optional.quick_start.optional_return_values" title="Optional return values">Optional
  44. return values</a>
  45. </h3></div></div></div>
  46. <p>
  47. Let's write and use a converter function that converts a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>
  48. to an <code class="computeroutput"><span class="keyword">int</span></code>. It is possible that
  49. for a given string (e.g. <code class="computeroutput"><span class="string">"cat"</span></code>)
  50. there exists no value of type <code class="computeroutput"><span class="keyword">int</span></code>
  51. capable of representing the conversion result. We do not consider such situation
  52. an error. We expect that the converter can be used only to check if the conversion
  53. is possible. A natural signature for this function can be:
  54. </p>
  55. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">optional</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  56. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">convert</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">text</span><span class="special">);</span>
  57. </pre>
  58. <p>
  59. All necessary functionality can be included with one header <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">optional</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>.
  60. The above function signature means that the function can either return a
  61. value of type <code class="computeroutput"><span class="keyword">int</span></code> or a flag
  62. indicating that no value of <code class="computeroutput"><span class="keyword">int</span></code>
  63. is available. This does not indicate an error. It is like one additional
  64. value of <code class="computeroutput"><span class="keyword">int</span></code>. This is how we
  65. can use our function:
  66. </p>
  67. <pre class="programlisting"><span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">text</span> <span class="special">=</span> <span class="comment">/*... */</span><span class="special">;</span>
  68. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">oi</span> <span class="special">=</span> <span class="identifier">convert</span><span class="special">(</span><span class="identifier">text</span><span class="special">);</span> <span class="comment">// move-construct</span>
  69. <span class="keyword">if</span> <span class="special">(</span><span class="identifier">oi</span><span class="special">)</span> <span class="comment">// contextual conversion to bool</span>
  70. <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="special">*</span><span class="identifier">oi</span><span class="special">;</span> <span class="comment">// operator*</span>
  71. </pre>
  72. <p>
  73. In order to test if <code class="computeroutput"><span class="identifier">optional</span></code>
  74. contains a value, we use the contextual conversion to type <code class="computeroutput"><span class="keyword">bool</span></code>. Because of this we can combine the initialization
  75. of the optional object and the test into one instruction:
  76. </p>
  77. <pre class="programlisting"><span class="keyword">if</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">oi</span> <span class="special">=</span> <span class="identifier">convert</span><span class="special">(</span><span class="identifier">text</span><span class="special">))</span>
  78. <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="special">*</span><span class="identifier">oi</span><span class="special">;</span>
  79. </pre>
  80. <p>
  81. We extract the contained value with <code class="computeroutput"><span class="keyword">operator</span><span class="special">*</span></code> (and with <code class="computeroutput"><span class="keyword">operator</span><span class="special">-&gt;</span></code> where it makes sense). An attempt to
  82. extract the contained value of an uninitialized optional object is an <span class="emphasis"><em>undefined
  83. behaviour</em></span> (UB). This implementation guards the call with <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span></code>. Therefore you should be sure
  84. that the contained value is there before extracting. For instance, the following
  85. code is reasonably UB-safe:
  86. </p>
  87. <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="special">*</span><span class="identifier">convert</span><span class="special">(</span><span class="string">"100"</span><span class="special">);</span>
  88. </pre>
  89. <p>
  90. This is because we know that string value <code class="computeroutput"><span class="string">"100"</span></code>
  91. converts to a valid value of <code class="computeroutput"><span class="keyword">int</span></code>.
  92. If you do not like this potential UB, you can use an alternative way of extracting
  93. the contained value:
  94. </p>
  95. <pre class="programlisting"><span class="keyword">try</span> <span class="special">{</span>
  96. <span class="keyword">int</span> <span class="identifier">j</span> <span class="special">=</span> <span class="identifier">convert</span><span class="special">(</span><span class="identifier">text</span><span class="special">).</span><span class="identifier">value</span><span class="special">();</span>
  97. <span class="special">}</span>
  98. <span class="keyword">catch</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bad_optional_access</span><span class="special">&amp;)</span> <span class="special">{</span>
  99. <span class="comment">// deal with it</span>
  100. <span class="special">}</span>
  101. </pre>
  102. <p>
  103. This version throws an exception upon an attempt to access a non-existent
  104. contained value. If your way of dealing with the missing value is to use
  105. some default, like <code class="computeroutput"><span class="number">0</span></code>, there exists
  106. a yet another alternative:
  107. </p>
  108. <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">k</span> <span class="special">=</span> <span class="identifier">convert</span><span class="special">(</span><span class="identifier">text</span><span class="special">).</span><span class="identifier">value_or</span><span class="special">(</span><span class="number">0</span><span class="special">);</span>
  109. </pre>
  110. <p>
  111. This uses the <code class="computeroutput"><span class="identifier">atoi</span></code>-like approach
  112. to conversions: if <code class="computeroutput"><span class="identifier">text</span></code> does
  113. not represent an integral number just return <code class="computeroutput"><span class="number">0</span></code>.
  114. Finally, you can provide a callback to be called when trying to access the
  115. contained value fails:
  116. </p>
  117. <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">fallback_to_default</span><span class="special">()</span>
  118. <span class="special">{</span>
  119. <span class="identifier">cerr</span> <span class="special">&lt;&lt;</span> <span class="string">"could not convert; using -1 instead"</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
  120. <span class="keyword">return</span> <span class="special">-</span><span class="number">1</span><span class="special">;</span>
  121. <span class="special">}</span>
  122. <span class="keyword">int</span> <span class="identifier">l</span> <span class="special">=</span> <span class="identifier">convert</span><span class="special">(</span><span class="identifier">text</span><span class="special">).</span><span class="identifier">value_or_eval</span><span class="special">(</span><span class="identifier">fallback_to_default</span><span class="special">);</span>
  123. </pre>
  124. <p>
  125. This will call the provided callback and return whatever the callback returns.
  126. The callback can have side effects: they will only be observed when the optional
  127. object does not contain a value.
  128. </p>
  129. <p>
  130. Now, let's consider how function <code class="computeroutput"><span class="identifier">convert</span></code>
  131. can be implemented.
  132. </p>
  133. <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">convert</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">text</span><span class="special">)</span>
  134. <span class="special">{</span>
  135. <span class="identifier">std</span><span class="special">::</span><span class="identifier">stringstream</span> <span class="identifier">s</span><span class="special">(</span><span class="identifier">text</span><span class="special">);</span>
  136. <span class="keyword">int</span> <span class="identifier">i</span><span class="special">;</span>
  137. <span class="keyword">if</span> <span class="special">((</span><span class="identifier">s</span> <span class="special">&gt;&gt;</span> <span class="identifier">i</span><span class="special">)</span> <span class="special">&amp;&amp;</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;::</span><span class="identifier">eof</span><span class="special">())</span>
  138. <span class="keyword">return</span> <span class="identifier">i</span><span class="special">;</span>
  139. <span class="keyword">else</span>
  140. <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">none</span><span class="special">;</span>
  141. <span class="special">}</span>
  142. </pre>
  143. <p>
  144. Observe the two return statements. <code class="computeroutput"><span class="keyword">return</span>
  145. <span class="identifier">i</span></code> uses the converting constructor
  146. that can create <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
  147. from <code class="computeroutput"><span class="identifier">T</span></code>. Thus constructed
  148. optional object is initialized and its value is a copy of <code class="computeroutput"><span class="identifier">i</span></code>.
  149. The other return statement uses another converting constructor from a special
  150. tag <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">none</span></code>. It is used to indicate that we want
  151. to create an uninitialized optional object.
  152. </p>
  153. </div>
  154. </div>
  155. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  156. <td align="left"></td>
  157. <td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014-2018 Andrzej Krzemie&#324;ski<p>
  158. Distributed under the Boost Software License, Version 1.0. (See accompanying
  159. file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
  160. </p>
  161. </div></td>
  162. </tr></table>
  163. <hr>
  164. <div class="spirit-nav">
  165. <a accesskey="p" href="../index.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="quick_start/optional_automatic_variables.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
  166. </div>
  167. </body>
  168. </html>