1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html> 3<head> 4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5<title>Chapter 21. Boost.Lexical_Cast 1.0</title> 6<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css"> 7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 8<link rel="home" href="index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> 9<link rel="up" href="libraries.html" title="Part I. The Boost C++ Libraries (BoostBook Subset)"> 10<link rel="prev" href="lambda/s10.html" title="Rationale for some of the design decisions"> 11<link rel="next" href="boost_lexical_cast/examples.html" title="Examples"> 12</head> 13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 14<table cellpadding="2" width="100%"><tr> 15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../boost.png"></td> 16<td align="center"><a href="../../index.html">Home</a></td> 17<td align="center"><a href="../../libs/libraries.htm">Libraries</a></td> 18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 20<td align="center"><a href="../../more/index.htm">More</a></td> 21</tr></table> 22<hr> 23<div class="spirit-nav"> 24<a accesskey="p" href="lambda/s10.html"><img src="../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="libraries.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="boost_lexical_cast/examples.html"><img src="../../doc/src/images/next.png" alt="Next"></a> 25</div> 26<div class="chapter"> 27<div class="titlepage"><div> 28<div><h2 class="title"> 29<a name="boost_lexical_cast"></a>Chapter 21. Boost.Lexical_Cast 1.0</h2></div> 30<div><p class="copyright">Copyright © 2000-2005 Kevlin Henney</p></div> 31<div><p class="copyright">Copyright © 2006-2010 Alexander Nasonov</p></div> 32<div><p class="copyright">Copyright © 2011-2020 Antony Polukhin</p></div> 33<div><div class="legalnotice"> 34<a name="boost_lexical_cast.legal"></a><p> 35 Distributed under the Boost Software License, Version 1.0. (See accompanying 36 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>) 37 </p> 38</div></div> 39</div></div> 40<div class="toc"> 41<p><b>Table of Contents</b></p> 42<dl class="toc"> 43<dt><span class="section"><a href="boost_lexical_cast.html#boost_lexical_cast.motivation">Motivation</a></span></dt> 44<dt><span class="section"><a href="boost_lexical_cast/examples.html">Examples</a></span></dt> 45<dd><dl> 46<dt><span class="section"><a href="boost_lexical_cast/examples.html#boost_lexical_cast.examples.strings_to_numbers_conversion">Strings 47 to numbers conversion</a></span></dt> 48<dt><span class="section"><a href="boost_lexical_cast/examples.html#boost_lexical_cast.examples.numbers_to_strings_conversion">Numbers 49 to strings conversion</a></span></dt> 50<dt><span class="section"><a href="boost_lexical_cast/examples.html#boost_lexical_cast.examples.converting_to_string_without_dynamic_memory_allocation">Converting 51 to string without dynamic memory allocation</a></span></dt> 52<dt><span class="section"><a href="boost_lexical_cast/examples.html#boost_lexical_cast.examples.converting_part_of_the_string">Converting 53 part of the string</a></span></dt> 54<dt><span class="section"><a href="boost_lexical_cast/examples.html#boost_lexical_cast.examples.generic_programming__boost_fusion_">Generic 55 programming (Boost.Fusion)</a></span></dt> 56<dt><span class="section"><a href="boost_lexical_cast/examples.html#boost_lexical_cast.examples.generic_programming__boost_variant_">Generic 57 programming (Boost.Variant)</a></span></dt> 58</dl></dd> 59<dt><span class="section"><a href="boost_lexical_cast/synopsis.html">Synopsis</a></span></dt> 60<dd><dl> 61<dt><span class="section"><a href="boost_lexical_cast/synopsis.html#boost_lexical_cast.synopsis.lexical_cast">lexical_cast</a></span></dt> 62<dt><span class="section"><a href="boost_lexical_cast/synopsis.html#boost_lexical_cast.synopsis.bad_lexical_cast">bad_lexical_cast</a></span></dt> 63<dt><span class="section"><a href="boost_lexical_cast/synopsis.html#boost_lexical_cast.synopsis.try_lexical_convert">try_lexical_convert</a></span></dt> 64</dl></dd> 65<dt><span class="section"><a href="boost_lexical_cast/frequently_asked_questions.html">Frequently 66 Asked Questions</a></span></dt> 67<dt><span class="section"><a href="boost_lexical_cast/changes.html">Changes</a></span></dt> 68<dt><span class="section"><a href="boost_lexical_cast/performance.html">Performance</a></span></dt> 69<dd><dl> 70<dt><span class="section"><a href="boost_lexical_cast/performance.html#boost_lexical_cast.performance.tests_description">Tests 71 description</a></span></dt> 72<dt><span class="section"><a href="boost_lexical_cast/performance.html#boost_lexical_cast.performance.gnu_c___version_6_1_1_20160511">GNU 73 C++ version 6.1.1 20160511</a></span></dt> 74<dt><span class="section"><a href="boost_lexical_cast/performance.html#boost_lexical_cast.performance.gnu_c___version_4_8_5">GNU 75 C++ version 4.8.5</a></span></dt> 76<dt><span class="section"><a href="boost_lexical_cast/performance.html#boost_lexical_cast.performance.clang_version_3_6_0__tags_release_360_final_">Clang 77 version 3.6.0 (tags/RELEASE_360/final)</a></span></dt> 78</dl></dd> 79</dl> 80</div> 81<div class="section"> 82<div class="titlepage"><div><div><h2 class="title" style="clear: both"> 83<a name="boost_lexical_cast.motivation"></a><a class="link" href="boost_lexical_cast.html#boost_lexical_cast.motivation" title="Motivation">Motivation</a> 84</h2></div></div></div> 85<p> 86 Sometimes a value must be converted to a literal text form, such as an <code class="computeroutput"><span class="keyword">int</span></code> represented as a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>, 87 or vice-versa, when a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code> is interpreted as an <code class="computeroutput"><span class="keyword">int</span></code>. Such examples are common when converting 88 between data types internal to a program and representation external to a program, 89 such as windows and configuration files. 90 </p> 91<p> 92 The standard C and C++ libraries offer a number of facilities for performing 93 such conversions. However, they vary with their ease of use, extensibility, 94 and safety. 95 </p> 96<p> 97 For instance, there are a number of limitations with the family of standard 98 C functions typified by <code class="computeroutput"><span class="identifier">atoi</span></code>: 99 </p> 100<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 101<li class="listitem"> 102 Conversion is supported in one direction only: from text to internal data 103 type. Converting the other way using the C library requires either the 104 inconvenience and compromised safety of the <code class="computeroutput"><span class="identifier">sprintf</span></code> 105 function, or the loss of portability associated with non-standard functions 106 such as <code class="computeroutput"><span class="identifier">itoa</span></code>. 107 </li> 108<li class="listitem"> 109 The range of types supported is only a subset of the built-in numeric types, 110 namely <code class="computeroutput"><span class="keyword">int</span></code>, <code class="computeroutput"><span class="keyword">long</span></code>, and <code class="computeroutput"><span class="keyword">double</span></code>. 111 </li> 112<li class="listitem"> 113 The range of types cannot be extended in a uniform manner. For instance, 114 conversion from string representation to complex or rational. 115 </li> 116</ul></div> 117<p> 118 The standard C functions typified by <code class="computeroutput"><span class="identifier">strtol</span></code> 119 have the same basic limitations, but offer finer control over the conversion 120 process. However, for the common case such control is often either not required 121 or not used. The <code class="computeroutput"><span class="identifier">scanf</span></code> family 122 of functions offer even greater control, but also lack safety and ease of use. 123 </p> 124<p> 125 The standard C++ library offers <code class="computeroutput"><span class="identifier">stringstream</span></code> 126 for the kind of in-core formatting being discussed. It offers a great deal 127 of control over the formatting and conversion of I/O to and from arbitrary 128 types through text. However, for simple conversions direct use of <code class="computeroutput"><span class="identifier">stringstream</span></code> can be either clumsy (with the 129 introduction of extra local variables and the loss of infix-expression convenience) 130 or obscure (where <code class="computeroutput"><span class="identifier">stringstream</span></code> 131 objects are created as temporary objects in an expression). Facets provide 132 a comprehensive concept and facility for controlling textual representation, 133 but their perceived complexity and high entry level requires an extreme degree 134 of involvement for simple conversions, and excludes all but a few programmers. 135 </p> 136<p> 137 The <code class="computeroutput"><span class="identifier">lexical_cast</span></code> function template 138 offers a convenient and consistent form for supporting common conversions to 139 and from arbitrary types when they are represented as text. The simplification 140 it offers is in expression-level convenience for such conversions. For more 141 involved conversions, such as where precision or formatting need tighter control 142 than is offered by the default behavior of <code class="computeroutput"><span class="identifier">lexical_cast</span></code>, 143 the conventional <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">stringstream</span></code> approach is recommended. Where 144 the conversions are numeric to numeric, <a href="../../libs/numeric/conversion/doc/html/boost_numericconversion/improved_numeric_cast__.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric_cast</span></code></a> 145 may offer more reasonable behavior than <code class="computeroutput"><span class="identifier">lexical_cast</span></code>. 146 </p> 147<p> 148 For a good discussion of the options and issues involved in string-based formatting, 149 including comparison of <code class="computeroutput"><span class="identifier">stringstream</span></code>, 150 <code class="computeroutput"><span class="identifier">lexical_cast</span></code>, and others, see 151 Herb Sutter's article, <a href="http://www.gotw.ca/publications/mill19.htm" target="_top">The 152 String Formatters of Manor Farm</a>. Also, take a look at the <a class="link" href="boost_lexical_cast/performance.html" title="Performance">Performance</a> 153 section. 154 </p> 155</div> 156</div> 157<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 158<td align="left"><p><small>Last revised: August 11, 2020 at 15:03:13 GMT</small></p></td> 159<td align="right"><div class="copyright-footer"></div></td> 160</tr></table> 161<hr> 162<div class="spirit-nav"> 163<a accesskey="p" href="lambda/s10.html"><img src="../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="libraries.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="boost_lexical_cast/examples.html"><img src="../../doc/src/images/next.png" alt="Next"></a> 164</div> 165</body> 166</html> 167