• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Converters</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="alternative_interface.html" title="Alternative Interface">
10<link rel="next" href="integration_of_user_types.html" title="Integration of User-Defined Types">
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="alternative_interface.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="integration_of_user_types.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.converters"></a><a class="link" href="converters.html" title="Converters">Converters</a>
28</h2></div></div></div>
29<p>
30      The <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">convert</span><span class="special">()</span></code>
31      API plays its role by providing a <span class="emphasis"><em>uniform interface</em></span> and
32      ensuring <span class="emphasis"><em>consistent behavior</em></span>. However, it is the respective
33      converter which does the hard work of actual type conversion/transformation.
34    </p>
35<p>
36      <span class="emphasis"><em>Boost.Convert</em></span> design reflects the fact that no one converter
37      is to satisfy all imaginable conversion/transformation-related user requirements.
38      Consequently, <span class="emphasis"><em>extendibility</em></span> and <span class="emphasis"><em>converter pluggability</em></span>
39      are important properties of <span class="emphasis"><em>Boost.Convert</em></span>. The library
40      provides several converters for common type conversions with varying degrees
41      of formatting support and performance. However, it is an expectation that more
42      generic-purpose and custom-specific converters are to be written and deployed
43      with <span class="emphasis"><em>Boost.Convert</em></span>.
44    </p>
45<p>
46      For a converter to be plugged in to the <span class="emphasis"><em>Boost.Convert</em></span>
47      framework it needs to be a <span class="emphasis"><em>callable</em></span> with one of the signatures:
48    </p>
49<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">TypeOut</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">TypeIn</span><span class="special">&gt;</span>
50<span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">TypeIn</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value_in</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="identifier">TypeOut</span><span class="special">&gt;&amp;</span> <span class="identifier">result_out</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
51
52<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">TypeOut</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">TypeIn</span><span class="special">&gt;</span>
53<span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">TypeIn</span> <span class="identifier">value_in</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="identifier">TypeOut</span><span class="special">&gt;&amp;</span> <span class="identifier">result_out</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
54</pre>
55<p>
56      if that is a general-purpose converter capable of handling many types (like
57      string-to-type and type-to-string conversions). Alternatively, a purpose-built
58      custom converter might only care to provide
59    </p>
60<pre class="programlisting"><span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">TypeIn</span> <span class="keyword">const</span><span class="special">&amp;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">TypeOut</span><span class="special">&gt;&amp;)</span> <span class="keyword">const</span><span class="special">;</span>
61</pre>
62<p>
63      if its sole purpose is to handle one specific conversion/transformation of
64      <span class="emphasis"><em>TypeIn</em></span> to <span class="emphasis"><em>TypeOut</em></span>. For example, a
65      converter from the operating-system-specific MBCS string format to the UCS-2
66      or UCS-4 (depending on <code class="computeroutput"><span class="keyword">wchar_t</span></code>
67      size) might be one such example:
68    </p>
69<pre class="programlisting"><span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&amp;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">wstring</span><span class="special">&gt;&amp;)</span> <span class="keyword">const</span><span class="special">;</span>
70</pre>
71<p>
72      Alternatively again, an ad-hoc in-place <span class="emphasis"><em>callable</em></span> might
73      be provided as a converter. For example,
74    </p>
75<p>
76</p>
77<pre class="programlisting"><span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">;</span>
78<span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lexical_cast</span><span class="special">;</span>
79<span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">convert</span><span class="special">;</span>
80</pre>
81<p>
82    </p>
83<p>
84</p>
85<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">v03</span> <span class="special">=</span> <span class="identifier">convert</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">str</span><span class="special">,</span>
86              <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">assign</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;,</span> <span class="identifier">_2</span><span class="special">,</span>
87                  <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">lexical_cast</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">string</span><span class="special">&gt;,</span> <span class="identifier">_1</span><span class="special">))).</span><span class="identifier">value_or</span><span class="special">(-</span><span class="number">1</span><span class="special">);</span>
88</pre>
89<p>
90    </p>
91<p>
92      or an old-fashioned function:
93    </p>
94<p>
95</p>
96<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">plain_old_func</span><span class="special">(</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value_in</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;&amp;</span> <span class="identifier">value_out</span><span class="special">)</span>
97</pre>
98<p>
99    </p>
100<p>
101</p>
102<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">v01</span> <span class="special">=</span> <span class="identifier">convert</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">str</span><span class="special">,</span> <span class="identifier">plain_old_func</span><span class="special">).</span><span class="identifier">value_or</span><span class="special">(-</span><span class="number">1</span><span class="special">);</span>
103</pre>
104<p>
105    </p>
106<p>
107      With regard to converters the <span class="emphasis"><em>Boost.Convert</em></span> framework
108      has been designed with the following requirement in mind:
109    </p>
110<div class="note"><table border="0" summary="Note">
111<tr>
112<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
113<th align="left">Note</th>
114</tr>
115<tr><td align="left" valign="top"><p>
116        Converters shall be independent from and must not rely on the <span class="emphasis"><em>Boost.Convert</em></span>
117        infrastructure.
118      </p></td></tr>
119</table></div>
120<h4>
121<a name="boost_convert.converters.h0"></a>
122      <span class="phrase"><a name="boost_convert.converters.implicit__emphasis_typein__emphasis__promotions_and_conversions"></a></span><a class="link" href="converters.html#boost_convert.converters.implicit__emphasis_typein__emphasis__promotions_and_conversions">Implicit
123      <span class="emphasis"><em>TypeIn</em></span> Promotions and Conversions</a>
124    </h4>
125<p>
126      It is worth remembering that <span class="emphasis"><em>TypeIn</em></span> in the signature should
127      be interpreted in the context of the potential implicit type promotions and
128      conversions allowed <span class="emphasis"><em>by the language</em></span>. For example, depending
129      on the context the <code class="computeroutput"><span class="identifier">take_double</span></code>
130      and <code class="computeroutput"><span class="identifier">take_int</span></code> converters below
131      might not do what is expected of them due to implicit <span class="emphasis"><em>int-to-double</em></span>
132      promotion and value-destroying <span class="emphasis"><em>double-to-int</em></span> conversion
133      applied <span class="emphasis"><em>by the compiler</em></span>:
134    </p>
135<p>
136</p>
137<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">take_double</span> <span class="special">{</span> <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">double</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="identifier">string</span><span class="special">&gt;&amp;)</span> <span class="keyword">const</span> <span class="special">{}};</span>
138<span class="keyword">struct</span>    <span class="identifier">take_int</span> <span class="special">{</span> <span class="keyword">void</span> <span class="keyword">operator</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">optional</span><span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;&amp;)</span> <span class="keyword">const</span> <span class="special">{}};</span>
139</pre>
140<p>
141    </p>
142<p>
143</p>
144<pre class="programlisting"><span class="identifier">convert</span><span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;(</span><span class="number">11</span><span class="special">,</span> <span class="identifier">take_double</span><span class="special">());</span> <span class="comment">// Compiler applies int-to-double promotion to call the converter.</span>
145<span class="identifier">convert</span><span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;(</span><span class="number">11.23</span><span class="special">,</span> <span class="identifier">take_int</span><span class="special">());</span> <span class="comment">// Compiler applies double-to-int implicit truncation.</span>
146</pre>
147<p>
148    </p>
149<p>
150      <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">convert</span><span class="special">()</span></code>
151      API does not modify <span class="emphasis"><em>TypeIn</em></span> or interpret it in any way.
152      The passed-in value and its type are delivered to the underlying converter
153      as-is. Consequently, if potential implicit type promotions and conversions
154      are not desirable, then it is the converter's responsibility to address that
155      issue. For example, one way to disable implicit conversions might be:
156    </p>
157<p>
158</p>
159<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">double_only</span>
160<span class="special">{</span>
161    <span class="comment">// Declared for all types.</span>
162    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">TypeIn</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">TypeIn</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="identifier">string</span><span class="special">&gt;&amp;)</span> <span class="keyword">const</span><span class="special">;</span>
163<span class="special">};</span>
164
165<span class="comment">// Defined only for certain types.</span>
166<span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">void</span> <span class="identifier">double_only</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()&lt;</span><span class="keyword">double</span><span class="special">&gt;(</span><span class="keyword">double</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="identifier">string</span><span class="special">&gt;&amp;)</span> <span class="keyword">const</span> <span class="special">{}</span>
167</pre>
168<p>
169    </p>
170<p>
171</p>
172<pre class="programlisting">    <span class="identifier">convert</span><span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;(</span><span class="number">11.23</span><span class="special">,</span> <span class="identifier">double_only</span><span class="special">());</span> <span class="comment">// Fine.</span>
173<span class="comment">//  convert&lt;string&gt;(11,    double_only()); // Fails: undefined reference to double_only::operator()&lt;int&gt;</span>
174</pre>
175<p>
176    </p>
177</div>
178<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
179<td align="left"></td>
180<td align="right"><div class="copyright-footer">Copyright © 2009-2016 Vladimir Batov<p>
181        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>.
182      </p>
183</div></td>
184</tr></table>
185<hr>
186<div class="spirit-nav">
187<a accesskey="p" href="alternative_interface.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="integration_of_user_types.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
188</div>
189</body>
190</html>
191