index.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Boost.Optional</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="next" href="boost_optional/quick_start.html" title="Quick Start">
  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="boost_optional/quick_start.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="optional"></a>Boost.Optional</h2></div>
  25. <div><div class="author"><h3 class="author">
  26. <span class="firstname">Fernando Luis</span> <span class="surname">Cacciola Carballal</span>
  27. </h3></div></div>
  28. <div><p class="copyright">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal</p></div>
  29. <div><p class="copyright">Copyright &#169; 2014-2018 Andrzej Krzemie&#324;ski</p></div>
  30. <div><div class="legalnotice">
  31. <a name="optional.legal"></a><p>
  32. Distributed under the Boost Software License, Version 1.0. (See accompanying
  33. 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>)
  34. </p>
  35. </div></div>
  36. </div></div>
  37. <div class="toc">
  38. <p><b>Table of Contents</b></p>
  39. <dl class="toc">
  40. <dt><span class="section"><a href="index.html#optional.introduction">Introduction</a></span></dt>
  41. <dt><span class="section"><a href="boost_optional/quick_start.html">Quick Start</a></span></dt>
  42. <dd><dl>
  43. <dt><span class="section"><a href="boost_optional/quick_start.html#boost_optional.quick_start.optional_return_values">Optional
  44. return values</a></span></dt>
  45. <dt><span class="section"><a href="boost_optional/quick_start/optional_automatic_variables.html">Optional
  46. automatic variables</a></span></dt>
  47. <dt><span class="section"><a href="boost_optional/quick_start/optional_data_members.html">Optional
  48. data members</a></span></dt>
  49. <dt><span class="section"><a href="boost_optional/quick_start/bypassing_unnecessary_default_construction.html">Bypassing
  50. unnecessary default construction</a></span></dt>
  51. <dt><span class="section"><a href="boost_optional/quick_start/storage_in_containers.html">Storage
  52. in containers</a></span></dt>
  53. </dl></dd>
  54. <dt><span class="section"><a href="optional/tutorial.html">Tutorial</a></span></dt>
  55. <dd><dl>
  56. <dt><span class="section"><a href="optional/tutorial.html#boost_optional.tutorial.motivation">Motivation</a></span></dt>
  57. <dt><span class="section"><a href="boost_optional/tutorial/design_overview.html">Design Overview</a></span></dt>
  58. <dt><span class="section"><a href="boost_optional/tutorial/when_to_use_optional.html">When to
  59. use Optional</a></span></dt>
  60. <dt><span class="section"><a href="boost_optional/tutorial/relational_operators.html">Relational
  61. operators</a></span></dt>
  62. <dt><span class="section"><a href="boost_optional/tutorial/io_operators.html">IO operators</a></span></dt>
  63. <dt><span class="section"><a href="boost_optional/tutorial/optional_references.html">Optional
  64. references</a></span></dt>
  65. <dt><span class="section"><a href="boost_optional/tutorial/in_place_factories.html">In-Place
  66. Factories</a></span></dt>
  67. <dt><span class="section"><a href="boost_optional/tutorial/gotchas.html">Gotchas</a></span></dt>
  68. <dt><span class="section"><a href="boost_optional/tutorial/exception_safety_guarantees.html">Exception
  69. Safety Guarantees</a></span></dt>
  70. <dt><span class="section"><a href="boost_optional/tutorial/type_requirements.html">Type requirements</a></span></dt>
  71. <dt><span class="section"><a href="boost_optional/tutorial/performance_considerations.html">Performance
  72. considerations</a></span></dt>
  73. </dl></dd>
  74. <dt><span class="section"><a href="optional/reference.html">Reference</a></span></dt>
  75. <dd><dl>
  76. <dt><span class="section"><a href="optional/reference.html#boost_optional.reference.header__boost_none_hpp_">Header
  77. &lt;boost/none.hpp&gt;</a></span></dt>
  78. <dt><span class="section"><a href="boost_optional/reference/header__boost_optional_bad_optional_access_hpp_.html">Header
  79. &lt;boost/optional/bad_optional_access.hpp&gt;</a></span></dt>
  80. <dt><span class="section"><a href="boost_optional/reference/io_header.html">Header &lt;boost/optional/optional_io.hpp&gt;</a></span></dt>
  81. <dt><span class="section"><a href="boost_optional/reference/header__boost_optional_optional_fwd_hpp_.html">Header
  82. &lt;boost/optional/optional_fwd.hpp&gt;</a></span></dt>
  83. <dt><span class="section"><a href="optional/reference/header__boost_optional_optional_hpp_.html">Header
  84. &lt;boost/optional/optional.hpp&gt;</a></span></dt>
  85. <dt><span class="section"><a href="boost_optional/reference/header__boost_optional_hpp_.html">Header
  86. &lt;boost/optional.hpp&gt;</a></span></dt>
  87. </dl></dd>
  88. <dt><span class="section"><a href="boost_optional/dependencies_and_portability.html">Dependencies
  89. and Portability</a></span></dt>
  90. <dd><dl>
  91. <dt><span class="section"><a href="boost_optional/dependencies_and_portability.html#boost_optional.dependencies_and_portability.dependencies">Dependencies</a></span></dt>
  92. <dt><span class="section"><a href="boost_optional/dependencies_and_portability/emplace_operations_in_older_compilers.html">Emplace
  93. operations in older compilers</a></span></dt>
  94. <dt><span class="section"><a href="boost_optional/dependencies_and_portability/optional_reference_binding.html">Optional
  95. Reference Binding</a></span></dt>
  96. </dl></dd>
  97. <dt><span class="section"><a href="boost_optional/relnotes.html">Release Notes</a></span></dt>
  98. <dt><span class="section"><a href="boost_optional/acknowledgements.html">Acknowledgements</a></span></dt>
  99. </dl>
  100. </div>
  101. <div class="section">
  102. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  103. <a name="optional.introduction"></a><a class="link" href="index.html#optional.introduction" title="Introduction">Introduction</a>
  104. </h2></div></div></div>
  105. <p>
  106. Class template <code class="computeroutput"><span class="identifier">optional</span></code> is
  107. a wrapper for representing 'optional' (or 'nullable') objects who may not (yet)
  108. contain a valid value. Optional objects offer full value semantics; they are
  109. good for passing by value and usage inside STL containers. This is a header-only
  110. library.
  111. </p>
  112. <h4>
  113. <a name="optional.introduction.h0"></a>
  114. <span class="phrase"><a name="optional.introduction.problem"></a></span><a class="link" href="index.html#optional.introduction.problem">Problem</a>
  115. </h4>
  116. <p>
  117. Suppose we want to read a parameter form a config file which represents some
  118. integral value, let's call it <code class="computeroutput"><span class="string">"MaxValue"</span></code>.
  119. It is possible that this parameter is not specified; such situation is no error.
  120. It is valid to not specify the parameter and in that case the program is supposed
  121. to behave slightly differently. Also, suppose that any possible value of type
  122. <code class="computeroutput"><span class="keyword">int</span></code> is a valid value for <code class="computeroutput"><span class="string">"MaxValue"</span></code>, so we cannot just use
  123. <code class="computeroutput"><span class="special">-</span><span class="number">1</span></code>
  124. to represent the absence of the parameter in the config file.
  125. </p>
  126. <h4>
  127. <a name="optional.introduction.h1"></a>
  128. <span class="phrase"><a name="optional.introduction.solution"></a></span><a class="link" href="index.html#optional.introduction.solution">Solution</a>
  129. </h4>
  130. <p>
  131. This is how you solve it with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span></code>:
  132. </p>
  133. <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>
  134. <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">getConfigParam</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">name</span><span class="special">);</span> <span class="comment">// return either an int or a `not-an-int`</span>
  135. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
  136. <span class="special">{</span>
  137. <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">getConfigParam</span><span class="special">(</span><span class="string">"MaxValue"</span><span class="special">))</span> <span class="comment">// did I get a real int?</span>
  138. <span class="identifier">runWithMax</span><span class="special">(*</span><span class="identifier">oi</span><span class="special">);</span> <span class="comment">// use my int</span>
  139. <span class="keyword">else</span>
  140. <span class="identifier">runWithNoMax</span><span class="special">();</span>
  141. <span class="special">}</span>
  142. </pre>
  143. </div>
  144. </div>
  145. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  146. <td align="left"><p><small>Last revised: December 10, 2019 at 00:22:19 GMT</small></p></td>
  147. <td align="right"><div class="copyright-footer"></div></td>
  148. </tr></table>
  149. <hr>
  150. <div class="spirit-nav"><a accesskey="n" href="boost_optional/quick_start.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a></div>
  151. </body>
  152. </html>