outcome.html 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  3. <title>Tying it all together - Boost.Outcome documentation</title>
  4. <link rel="stylesheet" href="../css/boost.css" type="text/css">
  5. <meta name="generator" content="Hugo 0.52 with Boostdoc theme">
  6. <meta name="viewport" content="width=device-width,initial-scale=1.0"/>
  7. <link rel="icon" href="../images/favicon.ico" type="image/ico"/>
  8. <body><div class="spirit-nav">
  9. <a accesskey="p" href="../experimental/worked-example/implicit_conversion.html"><img src="../images/prev.png" alt="Prev"></a>
  10. <a accesskey="u" href="../experimental.html"><img src="../images/up.png" alt="Up"></a>
  11. <a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="../experimental/c-api.html"><img src="../images/next.png" alt="Next"></a></div><div id="content">
  12. <div class="titlepage"><div><div><h1 style="clear: both">Tying it all together</h1></div></div></div>
  13. <p>Firstly let&rsquo;s alias a more convenient form of <code>status_result</code>:</p>
  14. <div class="code-snippet"><div class="highlight"><pre class="chroma"><code class="language-c++" data-lang="c++"><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span><span class="err"> </span><span class="nc">T</span><span class="p">,</span> <span class="k">class</span><span class="err"> </span><span class="nc">E</span> <span class="o">=</span> <span class="n">outcome_e</span><span class="o">::</span><span class="n">error</span><span class="o">&gt;</span>
  15. <span class="k">using</span> <span class="n">result</span> <span class="o">=</span> <span class="c1">//
  16. </span><span class="c1"></span><span class="n">outcome_e</span><span class="o">::</span><span class="n">status_result</span><span class="o">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="n">E</span><span class="p">,</span> <span class="n">outcome_e</span><span class="o">::</span><span class="n">policy</span><span class="o">::</span><span class="n">default_status_result_policy</span><span class="o">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="n">E</span><span class="o">&gt;&gt;</span><span class="p">;</span>
  17. </code></pre></div><a href="https://github.com/boostorg/outcome/tree/master/doc/src/snippets/experimental_status_code.cpp#L196" class="code-snippet-url" target="_blank">View this code on Github</a></div>
  18. <p>(The defaulting of <code>default_result_policy</code> is superfluous, it&rsquo;s already the default)</p>
  19. <p>What follows now is very standard Outcome code. Indeed, it would compile
  20. just fine under standard Outcome with only a few typedefs.</p>
  21. <div class="code-snippet"><div class="highlight"><pre class="chroma"><code class="language-c++" data-lang="c++"><span class="n">result</span><span class="o">&lt;</span><span class="n">file_handle</span><span class="p">,</span> <span class="n">file_io_error</span><span class="o">&gt;</span> <span class="n">open_file</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">path</span><span class="p">)</span> <span class="c1">// models throws(file_io_error)
  22. </span><span class="c1"></span><span class="p">{</span>
  23. <span class="n">file_handle</span> <span class="n">ret</span><span class="p">(</span><span class="o">::</span><span class="n">fopen</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">&#34;r&#34;</span><span class="p">));</span>
  24. <span class="k">if</span><span class="p">(</span><span class="n">ret</span><span class="p">)</span>
  25. <span class="k">return</span> <span class="n">ret</span><span class="p">;</span>
  26. <span class="k">return</span> <span class="nf">file_io_error</span><span class="p">({</span><span class="n">errno</span><span class="p">,</span> <span class="n">__LINE__</span><span class="p">,</span> <span class="n">__FILE__</span><span class="p">});</span>
  27. <span class="p">}</span>
  28. <span class="n">result</span><span class="o">&lt;</span><span class="kt">void</span><span class="o">&gt;</span> <span class="n">open_resource</span><span class="p">()</span> <span class="c1">// models throws(std::error)
  29. </span><span class="c1"></span><span class="p">{</span>
  30. <span class="k">for</span><span class="p">(;;)</span>
  31. <span class="p">{</span>
  32. <span class="n">result</span><span class="o">&lt;</span><span class="n">file_handle</span><span class="p">,</span> <span class="n">file_io_error</span><span class="o">&gt;</span> <span class="n">r</span> <span class="o">=</span> <span class="n">open_file</span><span class="p">(</span><span class="s">&#34;some file&#34;</span><span class="p">);</span>
  33. <span class="k">if</span><span class="p">(</span><span class="n">r</span><span class="p">)</span>
  34. <span class="k">break</span><span class="p">;</span>
  35. <span class="n">file_io_error</span> <span class="n">e</span> <span class="o">=</span> <span class="n">r</span><span class="p">.</span><span class="n">error</span><span class="p">();</span>
  36. <span class="k">if</span><span class="p">(</span><span class="n">e</span> <span class="o">!=</span> <span class="n">outcome_e</span><span class="o">::</span><span class="n">errc</span><span class="o">::</span><span class="n">resource_unavailable_try_again</span><span class="p">)</span>
  37. <span class="p">{</span>
  38. <span class="c1">// NOTE this implicitly converts from `file_io_error` to `error` via the
  39. </span><span class="c1"></span> <span class="c1">// `make_status_code()` free function customisation point defined above.
  40. </span><span class="c1"></span> <span class="k">return</span> <span class="n">e</span><span class="p">;</span>
  41. <span class="p">}</span>
  42. <span class="p">}</span>
  43. <span class="c1">// success continues here ...
  44. </span><span class="c1"></span> <span class="k">return</span> <span class="n">outcome_e</span><span class="o">::</span><span class="n">success</span><span class="p">();</span>
  45. <span class="p">}</span>
  46. <span class="kt">int</span> <span class="n">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
  47. <span class="p">{</span>
  48. <span class="n">result</span><span class="o">&lt;</span><span class="kt">void</span><span class="o">&gt;</span> <span class="n">r</span> <span class="o">=</span> <span class="n">open_resource</span><span class="p">();</span>
  49. <span class="k">if</span><span class="p">(</span><span class="n">r</span><span class="p">)</span>
  50. <span class="n">printf</span><span class="p">(</span><span class="s">&#34;Success!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
  51. <span class="k">else</span>
  52. <span class="p">{</span>
  53. <span class="k">auto</span> <span class="n">e</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">move</span><span class="p">(</span><span class="n">r</span><span class="p">).</span><span class="n">error</span><span class="p">();</span>
  54. <span class="c1">// A quick demonstration that the indirection works as indicated
  55. </span><span class="c1"></span> <span class="n">printf</span><span class="p">(</span><span class="s">&#34;Returned error has a code domain of &#39;%s&#39;, a message of &#39;%s&#39;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">e</span><span class="p">.</span><span class="n">domain</span><span class="p">().</span><span class="n">name</span><span class="p">().</span><span class="n">c_str</span><span class="p">(),</span> <span class="n">e</span><span class="p">.</span><span class="n">message</span><span class="p">().</span><span class="n">c_str</span><span class="p">());</span>
  56. <span class="n">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">And semantically comparing it to &#39;errc::no_such_file_or_directory&#39; = %d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">e</span> <span class="o">==</span> <span class="n">outcome_e</span><span class="o">::</span><span class="n">errc</span><span class="o">::</span><span class="n">no_such_file_or_directory</span><span class="p">);</span>
  57. <span class="p">}</span>
  58. <span class="p">}</span>
  59. </code></pre></div><a href="https://github.com/boostorg/outcome/tree/master/doc/src/snippets/experimental_status_code.cpp#L201" class="code-snippet-url" target="_blank">View this code on Github</a></div>
  60. <p>And running this program yields:</p>
  61. <pre><code>Returned error has a code domain of 'file i/o error domain', a message of 'No such file or directory (c:\users\ned\documents\boostish\outcome\doc\src\snippets\experimental_status_code.cpp:195)'
  62. And semantically comparing it to 'errc::no_such_file_or_directory' = 1
  63. </code></pre>
  64. <h3 id="conclusion">Conclusion</h3>
  65. <p>Once you get used to <code>&lt;system_error2&gt;</code> and the fact that any <code>result</code> with
  66. <code>E = error</code> is always move-only, using experimental Outcome is just like
  67. using normal Outcome. Except that codegen will be better, custom domains
  68. are safe to use in headers, semantic comparisons have guaranteed complexity
  69. bounds, and build times are much reduced.</p>
  70. <p>What&rsquo;s not to like? :)</p>
  71. <p>Finally, if you have feedback on using experimental Outcome which you think
  72. would be of use to the standards committee when evaluating possible
  73. implementations of <a href="http://wg21.link/P0709">P0709 <em>Zero overhead exceptions: Throwing values</em></a>,
  74. please do get in touch! This <strong>especially</strong> includes successful experiences!!!</p>
  75. </div><p><small>Last revised: February 05, 2019 at 17:14:18 UTC</small></p>
  76. <hr>
  77. <div class="spirit-nav">
  78. <a accesskey="p" href="../experimental/worked-example/implicit_conversion.html"><img src="../images/prev.png" alt="Prev"></a>
  79. <a accesskey="u" href="../experimental.html"><img src="../images/up.png" alt="Up"></a>
  80. <a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="../experimental/c-api.html"><img src="../images/next.png" alt="Next"></a></div></body>
  81. </html>