1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Boost.Convert with Standard Algorithms</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="Chapter 1. Boost.Convert 2.0"> 8<link rel="up" href="../index.html" title="Chapter 1. Boost.Convert 2.0"> 9<link rel="prev" href="integration_of_user_types.html" title="Integration of User-Defined Types"> 10<link rel="next" href="performance.html" title="Performance"> 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="integration_of_user_types.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="performance.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_convert.algorithms"></a><a class="link" href="algorithms.html" title="Boost.Convert with Standard Algorithms">Boost.Convert with Standard Algorithms</a> 28</h2></div></div></div> 29<p> 30 The following code demonstrates a failed attempt (and one of the reasons <span class="emphasis"><em>Boost.Convert</em></span> 31 has been developed) to convert a few <code class="computeroutput"><span class="identifier">string</span></code>s 32 to <code class="computeroutput"><span class="keyword">int</span></code>s with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lexical_cast</span></code>: 33 </p> 34<p> 35</p> 36<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*,</span> <span class="number">3</span><span class="special">></span> <span class="identifier">strs</span> <span class="special">=</span> <span class="special">{{</span> <span class="string">" 5"</span><span class="special">,</span> <span class="string">"0XF"</span><span class="special">,</span> <span class="string">"not an int"</span> <span class="special">}};</span> 37<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">ints</span><span class="special">;</span> 38 39<span class="keyword">try</span> 40<span class="special">{</span> 41 <span class="identifier">std</span><span class="special">::</span><span class="identifier">transform</span><span class="special">(</span><span class="identifier">strs</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">strs</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">back_inserter</span><span class="special">(</span><span class="identifier">ints</span><span class="special">),</span> 42 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lexical_cast</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">string</span><span class="special">>,</span> <span class="identifier">_1</span><span class="special">));</span> 43 44 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="number">0</span> <span class="special">&&</span> <span class="string">"Never reached!"</span><span class="special">);</span> 45<span class="special">}</span> 46<span class="keyword">catch</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span><span class="special">&)</span> 47<span class="special">{</span> 48 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// No strings converted.</span> 49<span class="special">}</span> 50</pre> 51<p> 52 </p> 53<p> 54 If the exception-throwing behavior is the desired behavior, then <span class="emphasis"><em>Boost.Convert</em></span> 55 supports that. In addition, it also supports a non-throwing process-flow: 56 </p> 57<p> 58</p> 59<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*,</span> <span class="number">3</span><span class="special">></span> <span class="identifier">strs</span> <span class="special">=</span> <span class="special">{{</span> <span class="string">" 5"</span><span class="special">,</span> <span class="string">"0XF"</span><span class="special">,</span> <span class="string">"not an int"</span> <span class="special">}};</span> 60<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">ints</span><span class="special">;</span> 61 62<span class="identifier">std</span><span class="special">::</span><span class="identifier">transform</span><span class="special">(</span><span class="identifier">strs</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">strs</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">back_inserter</span><span class="special">(</span><span class="identifier">ints</span><span class="special">),</span> 63 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">lexical_cast</span><span class="special">()).</span><span class="identifier">value_or</span><span class="special">(-</span><span class="number">1</span><span class="special">));</span> 64 65<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span> 66<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">ints</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="special">-</span><span class="number">1</span><span class="special">);</span> <span class="comment">// Failed conversion does not throw.</span> 67<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">ints</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="special">-</span><span class="number">1</span><span class="special">);</span> <span class="comment">// Failed conversion does not throw.</span> 68<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">ints</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">==</span> <span class="special">-</span><span class="number">1</span><span class="special">);</span> <span class="comment">// Failed conversion does not throw.</span> 69</pre> 70<p> 71 </p> 72<p> 73 Deploying <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">cstream</span></code> 74 with better formatting capabilities yields better results with exception-throwing 75 and non-throwing process-flows still supported: 76 </p> 77<p> 78</p> 79<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*,</span> <span class="number">3</span><span class="special">></span> <span class="identifier">strs</span> <span class="special">=</span> <span class="special">{{</span> <span class="string">" 5"</span><span class="special">,</span> <span class="string">"0XF"</span><span class="special">,</span> <span class="string">"not an int"</span> <span class="special">}};</span> 80<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">ints</span><span class="special">;</span> 81<span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">cstream</span> <span class="identifier">cnv</span><span class="special">;</span> 82 83<span class="keyword">try</span> 84<span class="special">{</span> 85 <span class="identifier">std</span><span class="special">::</span><span class="identifier">transform</span><span class="special">(</span><span class="identifier">strs</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">strs</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">back_inserter</span><span class="special">(</span><span class="identifier">ints</span><span class="special">),</span> 86 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">cnv</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">hex</span><span class="special">)(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">skipws</span><span class="special">))));</span> 87 88 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="number">0</span> <span class="special">&&</span> <span class="string">"Never reached!"</span><span class="special">);</span> 89<span class="special">}</span> 90<span class="keyword">catch</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bad_optional_access</span> <span class="keyword">const</span><span class="special">&)</span> 91<span class="special">{</span> 92 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">2</span><span class="special">);</span> <span class="comment">// Only the first two strings converted.</span> 93 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">ints</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">5</span><span class="special">);</span> <span class="comment">// " 5"</span> 94 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">ints</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="number">15</span><span class="special">);</span> <span class="comment">// "0XF"</span> 95 96 <span class="comment">// "not an int" causes the exception thrown.</span> 97<span class="special">}</span> 98</pre> 99<p> 100 </p> 101<p> 102</p> 103<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">transform</span><span class="special">(</span><span class="identifier">strs</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">strs</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">back_inserter</span><span class="special">(</span><span class="identifier">ints</span><span class="special">),</span> 104 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">cnv</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">hex</span><span class="special">)(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">skipws</span><span class="special">))).</span><span class="identifier">value_or</span><span class="special">(-</span><span class="number">1</span><span class="special">));</span> 105 106<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span> 107<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">ints</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">5</span><span class="special">);</span> 108<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">ints</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="number">15</span><span class="special">);</span> 109<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">ints</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">==</span> <span class="special">-</span><span class="number">1</span><span class="special">);</span> <span class="comment">// Failed conversion</span> 110</pre> 111<p> 112 </p> 113<div class="important"><table border="0" summary="Important"> 114<tr> 115<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../doc/src/images/important.png"></td> 116<th align="left">Important</th> 117</tr> 118<tr><td align="left" valign="top"> 119<p> 120 One notable difference in the deployment of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">cstream</span></code> with algorithms is the use of 121 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span></code> (or <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cref</span></code> 122 in C++11). 123 </p> 124<p> 125 It needs to be remembered that with standard algorithms the deployed converter 126 needs to be <a href="http://en.cppreference.com/w/cpp/named_req/TriviallyCopyable" target="_top">copyable</a> 127 or <a href="http://en.cppreference.com/w/cpp/named_req/MoveAssignable" target="_top">movable 128 (C++11)</a> and is, in fact, copied or moved by the respective algorithm 129 before being used. Given that <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cstringstream</span></code> 130 is not copyable, <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">cstream</span></code> 131 is not copyable either. That limitation is routinely worked-around using 132 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span></code> or <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span></code>. 133 </p> 134</td></tr> 135</table></div> 136<p> 137 And now an example of algorithm-based integer-to-string formatted conversion 138 with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">hex</span></code>, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">uppercase</span></code> 139 and <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">showbase</span></code> formatting applied: 140 </p> 141<p> 142</p> 143<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">3</span><span class="special">></span> <span class="identifier">ints</span> <span class="special">=</span> <span class="special">{{</span> <span class="number">15</span><span class="special">,</span> <span class="number">16</span><span class="special">,</span> <span class="number">17</span> <span class="special">}};</span> 144<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</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="identifier">strs</span><span class="special">;</span> 145<span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">cstream</span> <span class="identifier">cnv</span><span class="special">;</span> 146 147<span class="identifier">cnv</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">hex</span><span class="special">)(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">uppercase</span><span class="special">)(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">showbase</span><span class="special">);</span> 148 149<span class="identifier">std</span><span class="special">::</span><span class="identifier">transform</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">ints</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">back_inserter</span><span class="special">(</span><span class="identifier">strs</span><span class="special">),</span> 150 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">string</span><span class="special">>(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">cnv</span><span class="special">)));</span> 151 152<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">strs</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span> 153<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">strs</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="string">"0XF"</span><span class="special">);</span> <span class="comment">// 15</span> 154<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">strs</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="string">"0X10"</span><span class="special">);</span> <span class="comment">// 16</span> 155<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">strs</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">==</span> <span class="string">"0X11"</span><span class="special">);</span> <span class="comment">// 17</span> 156</pre> 157<p> 158 </p> 159<h4> 160<a name="boost_convert.algorithms.h0"></a> 161 <span class="phrase"><a name="boost_convert.algorithms.forced__emphasis_typein__emphasis__vs__deduced"></a></span><a class="link" href="algorithms.html#boost_convert.algorithms.forced__emphasis_typein__emphasis__vs__deduced">Forced 162 <span class="emphasis"><em>TypeIn</em></span> vs. Deduced</a> 163 </h4> 164<p> 165 So far it was sufficient to explicitly specify only one type to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">TypeOut</span><span class="special">></span></code> 166 -- the target <span class="emphasis"><em>TypeOut</em></span> type. The source <span class="emphasis"><em>TypeIn</em></span> 167 type was provided implicitly through the algorithm and often it all just works 168 (as the examples above demonstrate). However, at times more control is needed 169 regarding the <span class="emphasis"><em>TypeIn</em></span> type and <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">apply</span><span class="special">()</span></code> provides 170 such control via explicit specification of <span class="emphasis"><em>TypeIn</em></span> -- 171 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">TypeOut</span><span class="special">,</span> <span class="identifier">TypeIn</span><span class="special">></span></code>. 172 </p> 173<p> 174 The following example demonstrates an interesting issue related to the <span class="emphasis"><em><code class="computeroutput"><span class="identifier">change</span></code></em></span> class introduced in <a class="link" href="integration_of_user_types.html" title="Integration of User-Defined Types">Integration of User-Defined 175 Types</a>. The class is essentially a glorified <span class="emphasis"><em><code class="computeroutput"><span class="keyword">enum</span></code></em></span>, a user-friendly convenience 176 wrapper around the actual <span class="emphasis"><em><code class="computeroutput"><span class="keyword">enum</span> 177 <span class="identifier">value_type</span> <span class="special">{</span> 178 <span class="identifier">no</span><span class="special">,</span> <span class="identifier">up</span><span class="special">,</span> <span class="identifier">dn</span> 179 <span class="special">}</span></code></em></span>. In the example an array 180 of <span class="emphasis"><em><code class="computeroutput"><span class="identifier">change</span></code></em></span> 181 values (<code class="computeroutput"><span class="identifier">chgs1</span></code>) is sensibly 182 converted to readable "no", "up" and "dn" strings 183 (<code class="computeroutput"><span class="identifier">strs1</span></code>) when an array of <span class="emphasis"><em><code class="computeroutput"><span class="identifier">change</span><span class="special">::</span><span class="identifier">value_type</span></code></em></span> values (<code class="computeroutput"><span class="identifier">chgs2</span></code>) converts to obscure "0", 184 "1" and "2" (<code class="computeroutput"><span class="identifier">strs2</span></code>). 185 </p> 186<p> 187</p> 188<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="identifier">change</span><span class="special">,</span> <span class="number">3</span><span class="special">></span> <span class="identifier">chgs1</span> <span class="special">=</span> <span class="special">{{</span> <span class="identifier">change</span><span class="special">::</span><span class="identifier">no</span><span class="special">,</span> <span class="identifier">change</span><span class="special">::</span><span class="identifier">up</span><span class="special">,</span> <span class="identifier">change</span><span class="special">::</span><span class="identifier">dn</span> <span class="special">}};</span> 189<span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="identifier">change</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">,</span> <span class="number">3</span><span class="special">></span> <span class="identifier">chgs2</span> <span class="special">=</span> <span class="special">{{</span> <span class="identifier">change</span><span class="special">::</span><span class="identifier">no</span><span class="special">,</span> <span class="identifier">change</span><span class="special">::</span><span class="identifier">up</span><span class="special">,</span> <span class="identifier">change</span><span class="special">::</span><span class="identifier">dn</span> <span class="special">}};</span> 190<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</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="identifier">strs1</span><span class="special">;</span> 191<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</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="identifier">strs2</span><span class="special">;</span> 192<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</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="identifier">strs3</span><span class="special">;</span> 193<span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">cstream</span> <span class="identifier">cnv</span><span class="special">;</span> 194 195<span class="identifier">std</span><span class="special">::</span><span class="identifier">transform</span><span class="special">(</span><span class="identifier">chgs1</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">chgs1</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">back_inserter</span><span class="special">(</span><span class="identifier">strs1</span><span class="special">),</span> 196 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">string</span><span class="special">>(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">cnv</span><span class="special">)));</span> <span class="comment">// Deduced TypeIn is 'change'</span> 197 198<span class="identifier">std</span><span class="special">::</span><span class="identifier">transform</span><span class="special">(</span><span class="identifier">chgs2</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">chgs2</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">back_inserter</span><span class="special">(</span><span class="identifier">strs2</span><span class="special">),</span> 199 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">string</span><span class="special">>(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">cnv</span><span class="special">)));</span> <span class="comment">// Deduced TypeIn is 'change::value_type'</span> 200 201<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">strs1</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span> 202<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">strs1</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="string">"no"</span><span class="special">);</span> 203<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">strs1</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="string">"up"</span><span class="special">);</span> 204<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">strs1</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">==</span> <span class="string">"dn"</span><span class="special">);</span> 205 206<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">strs2</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span> 207<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">strs2</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="string">"0"</span><span class="special">);</span> 208<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">strs2</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="string">"1"</span><span class="special">);</span> 209<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">strs2</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">==</span> <span class="string">"2"</span><span class="special">);</span> 210</pre> 211<p> 212 </p> 213<p> 214 The <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">TypeOut</span><span class="special">,</span> <span class="identifier">TypeIn</span><span class="special">></span></code> with forced (rather than deduced) <span class="emphasis"><em>TypeIn</em></span> 215 comes to the rescue and converts the array of <span class="emphasis"><em><code class="computeroutput"><span class="identifier">change</span><span class="special">::</span><span class="identifier">value_type</span></code></em></span> 216 values (<code class="computeroutput"><span class="identifier">chgs2</span></code>) to sensible 217 "no", "up" and "dn" (<code class="computeroutput"><span class="identifier">strs3</span></code>): 218 </p> 219<p> 220</p> 221<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">transform</span><span class="special">(</span><span class="identifier">chgs2</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">chgs2</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">back_inserter</span><span class="special">(</span><span class="identifier">strs3</span><span class="special">),</span> 222 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">string</span><span class="special">,</span> <span class="identifier">change</span><span class="special">>(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">cnv</span><span class="special">)));</span> 223 224<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">strs3</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span> 225<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">strs3</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="string">"no"</span><span class="special">);</span> 226<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">strs3</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="string">"up"</span><span class="special">);</span> 227<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">strs3</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">==</span> <span class="string">"dn"</span><span class="special">);</span> 228</pre> 229<p> 230 </p> 231<div class="note"><table border="0" summary="Note"> 232<tr> 233<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td> 234<th align="left">Note</th> 235</tr> 236<tr><td align="left" valign="top"><p> 237 For demonstration purposes the example above is made as simple as possible 238 and, consequently, the described "issue" could probably be addressed 239 by other means. Still, do not let my inability to come up with a better (complex 240 but short and succulent) example get in the way of appreciating the described 241 functionality. I do not expect it to be used often but it is here when you 242 need it. 243 </p></td></tr> 244</table></div> 245</div> 246<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 247<td align="left"></td> 248<td align="right"><div class="copyright-footer">Copyright © 2009-2016 Vladimir Batov<p> 249 Distributed under the Boost Software License, Version 1.0. See copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>. 250 </p> 251</div></td> 252</tr></table> 253<hr> 254<div class="spirit-nav"> 255<a accesskey="p" href="integration_of_user_types.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="performance.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> 256</div> 257</body> 258</html> 259