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>Examples</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="../boost_typeindex.html" title="Chapter 41. Boost.TypeIndex 4.1"> 10<link rel="prev" href="how_it_works.html" title="How it works"> 11<link rel="next" href="../boost_typeindex_header_reference.html" title="Boost.TypeIndex Header Reference"> 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="how_it_works.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_typeindex.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_typeindex_header_reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 25</div> 26<div class="section"> 27<div class="titlepage"><div><div><h2 class="title" style="clear: both"> 28<a name="boost_typeindex.examples"></a><a class="link" href="examples.html" title="Examples">Examples</a> 29</h2></div></div></div> 30<div class="toc"><dl class="toc"> 31<dt><span class="section"><a href="examples.html#boost_typeindex.examples.getting_human_readable_and_mangl">Getting 32 human readable and mangled type names</a></span></dt> 33<dt><span class="section"><a href="examples.html#boost_typeindex.examples.storing_information_about_a_type">Storing 34 information about a type in container </a></span></dt> 35<dt><span class="section"><a href="examples.html#boost_typeindex.examples.getting_through_the_inheritance_">Getting 36 through the inheritance to receive a real type name </a></span></dt> 37<dt><span class="section"><a href="examples.html#boost_typeindex.examples.using_runtime_cast_where_rtti_is">Using 38 runtime_cast where RTTI is unavailable or undesirable </a></span></dt> 39<dt><span class="section"><a href="examples.html#boost_typeindex.examples.exact_type_matching_storing_type">Exact 40 type matching: storing type with const, volatile and reference qualifiers</a></span></dt> 41<dt><span class="section"><a href="examples.html#boost_typeindex.examples.table_of_raw_name_and_pretty_nam">Table 42 of raw_name() and pretty_name() outputs with and without RTTI </a></span></dt> 43<dt><span class="section"><a href="examples.html#boost_typeindex.examples.c_14_checking_namespace_at_compi">C++14: 44 Checking namespace at compile time </a></span></dt> 45<dt><span class="section"><a href="examples.html#boost_typeindex.examples.c_14_checking_lexigraphical_orde">C++14: 46 Checking lexigraphical order of provided types </a></span></dt> 47</dl></div> 48<div class="section"> 49<div class="titlepage"><div><div><h3 class="title"> 50<a name="boost_typeindex.examples.getting_human_readable_and_mangl"></a><a class="link" href="examples.html#boost_typeindex.examples.getting_human_readable_and_mangl" title="Getting human readable and mangled type names">Getting 51 human readable and mangled type names</a> 52</h3></div></div></div> 53<p> 54 The following example shows how short (mangled) and human readable type names 55 could be obtained from a type. Works with and without RTTI. 56 </p> 57<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_index</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 58<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 59 60<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> 61<span class="keyword">void</span> <span class="identifier">foo</span><span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">{</span> 62 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\n Short name: "</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">type_id</span><span class="special"><</span><span class="identifier">T</span><span class="special">>().</span><span class="identifier">raw_name</span><span class="special">();</span> 63 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\n Readable name: "</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">type_id</span><span class="special"><</span><span class="identifier">T</span><span class="special">>().</span><span class="identifier">pretty_name</span><span class="special">();</span> 64<span class="special">}</span> 65 66<span class="keyword">struct</span> <span class="identifier">user_defined_type</span><span class="special">{};</span> 67 68<span class="keyword">namespace</span> <span class="identifier">ns1</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">ns2</span> <span class="special">{</span> 69 <span class="keyword">struct</span> <span class="identifier">user_defined_type</span><span class="special">{};</span> 70<span class="special">}}</span> <span class="comment">// namespace ns1::ns2</span> 71 72<span class="keyword">namespace</span> <span class="special">{</span> 73 <span class="keyword">struct</span> <span class="identifier">in_anon_type</span><span class="special">{};</span> 74<span class="special">}</span> <span class="comment">// anonymous namespace</span> 75 76<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 77 <span class="comment">// Call to</span> 78 <span class="identifier">foo</span><span class="special">(</span><span class="number">1</span><span class="special">);</span> 79 <span class="comment">// will output something like this:</span> 80 <span class="comment">//</span> 81 <span class="comment">// (RTTI on) (RTTI off)</span> 82 <span class="comment">// Short name: i Short name: int]</span> 83 <span class="comment">// Readable name: int Readable name: int</span> 84 85 <span class="identifier">user_defined_type</span> <span class="identifier">t</span><span class="special">;</span> 86 <span class="identifier">foo</span><span class="special">(</span><span class="identifier">t</span><span class="special">);</span> 87 <span class="comment">// Will output:</span> 88 <span class="comment">//</span> 89 <span class="comment">// (RTTI on) (RTTI off)</span> 90 <span class="comment">// Short name: 17user_defined_type user_defined_type]</span> 91 <span class="comment">// Readable name: user_defined_type user_defined_type</span> 92 93 <span class="identifier">ns1</span><span class="special">::</span><span class="identifier">ns2</span><span class="special">::</span><span class="identifier">user_defined_type</span> <span class="identifier">t_in_ns</span><span class="special">;</span> 94 <span class="identifier">foo</span><span class="special">(</span><span class="identifier">t_in_ns</span><span class="special">);</span> 95 <span class="comment">// Will output:</span> 96 <span class="comment">//</span> 97 <span class="comment">// (RTTI on) (RTTI off)</span> 98 <span class="comment">// Short name: N3ns13ns217user_defined_typeE ns1::ns2::user_defined_type]</span> 99 <span class="comment">// Readable name: ns1::ns2::user_defined_type ns1::ns2::user_defined_type</span> 100 101 <span class="identifier">in_anon_type</span> <span class="identifier">anon_t</span><span class="special">;</span> 102 <span class="identifier">foo</span><span class="special">(</span><span class="identifier">anon_t</span><span class="special">);</span> 103 <span class="comment">// Will output:</span> 104 <span class="comment">//</span> 105 <span class="comment">// (RTTI on) (RTTI off)</span> 106 <span class="comment">// Short name: N12_GLOBAL__N_112in_anon_typeE {anonymous}::in_anon_type]</span> 107 <span class="comment">// Readable name: (anonymous namespace)::in_anon_type {anonymous}::in_anon_type</span> 108<span class="special">}</span> 109</pre> 110<p> 111 Short names are very compiler dependant: some compiler will output <code class="computeroutput"><span class="special">.</span><span class="identifier">H</span></code>, others 112 <code class="computeroutput"><span class="identifier">i</span></code>. 113 </p> 114<p> 115 Readable names may also differ between compilers: <code class="computeroutput"><span class="keyword">struct</span> 116 <span class="identifier">user_defined_type</span></code>, <code class="computeroutput"><span class="identifier">user_defined_type</span></code>. 117 </p> 118<div class="warning"><table border="0" summary="Warning"> 119<tr> 120<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 121<th align="left">Warning</th> 122</tr> 123<tr><td align="left" valign="top"><p> 124 With RTTI off different classes with same names in anonymous namespace 125 may collapse. See 'RTTI emulation limitations'. 126 </p></td></tr> 127</table></div> 128</div> 129<div class="section"> 130<div class="titlepage"><div><div><h3 class="title"> 131<a name="boost_typeindex.examples.storing_information_about_a_type"></a><a class="link" href="examples.html#boost_typeindex.examples.storing_information_about_a_type" title="Storing information about a type in container">Storing 132 information about a type in container </a> 133</h3></div></div></div> 134<p> 135 The following example shows how an information about a type could be stored. 136 Example works with and without RTTI. 137 </p> 138<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_index</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 139<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">unordered</span><span class="special">/</span><span class="identifier">unordered_set</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 140<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span> 141 142<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 143 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unordered_set</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">type_index</span><span class="special">></span> <span class="identifier">types</span><span class="special">;</span> 144 145 <span class="comment">// Storing some `boost::type_info`s</span> 146 <span class="identifier">types</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">type_id</span><span class="special"><</span><span class="keyword">int</span><span class="special">>());</span> 147 <span class="identifier">types</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">type_id</span><span class="special"><</span><span class="keyword">float</span><span class="special">>());</span> 148 149 <span class="comment">// `types` variable contains two `boost::type_index`es:</span> 150 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">types</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> 151 152 <span class="comment">// Const, volatile and reference will be striped from the type:</span> 153 <span class="keyword">bool</span> <span class="identifier">is_inserted</span> <span class="special">=</span> <span class="identifier">types</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">type_id</span><span class="special"><</span><span class="keyword">const</span> <span class="keyword">int</span><span class="special">>()).</span><span class="identifier">second</span><span class="special">;</span> 154 <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">is_inserted</span><span class="special">);</span> 155 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">types</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">type_id</span><span class="special"><</span><span class="keyword">float</span><span class="special">&>())</span> <span class="special">==</span> <span class="number">1</span><span class="special">);</span> 156 157 <span class="comment">// We have erased the `float` type, only `int` remains</span> 158 <span class="identifier">assert</span><span class="special">(*</span><span class="identifier">types</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">type_id</span><span class="special"><</span><span class="keyword">int</span><span class="special">>());</span> 159<span class="special">}</span> 160</pre> 161</div> 162<div class="section"> 163<div class="titlepage"><div><div><h3 class="title"> 164<a name="boost_typeindex.examples.getting_through_the_inheritance_"></a><a class="link" href="examples.html#boost_typeindex.examples.getting_through_the_inheritance_" title="Getting through the inheritance to receive a real type name">Getting 165 through the inheritance to receive a real type name </a> 166</h3></div></div></div> 167<p> 168 The following example shows that <code class="computeroutput"><span class="identifier">type_info</span></code> 169 is able to store the real type, successfully getting through all the inheritances. 170 </p> 171<p> 172 Example works with and without RTTI." 173 </p> 174<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_index</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 175<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_index</span><span class="special">/</span><span class="identifier">runtime_cast</span><span class="special">/</span><span class="identifier">register_runtime_class</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 176<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 177 178<span class="keyword">struct</span> <span class="identifier">A</span> <span class="special">{</span> 179 <span class="identifier">BOOST_TYPE_INDEX_REGISTER_CLASS</span> 180 <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">A</span><span class="special">(){}</span> 181<span class="special">};</span> 182<span class="keyword">struct</span> <span class="identifier">B</span><span class="special">:</span> <span class="keyword">public</span> <span class="identifier">A</span> <span class="special">{</span> <span class="identifier">BOOST_TYPE_INDEX_REGISTER_CLASS</span> <span class="special">};</span> 183<span class="keyword">struct</span> <span class="identifier">C</span><span class="special">:</span> <span class="keyword">public</span> <span class="identifier">B</span> <span class="special">{</span> <span class="identifier">BOOST_TYPE_INDEX_REGISTER_CLASS</span> <span class="special">};</span> 184<span class="keyword">struct</span> <span class="identifier">D</span><span class="special">:</span> <span class="keyword">public</span> <span class="identifier">C</span> <span class="special">{</span> <span class="identifier">BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS</span><span class="special">(</span><span class="identifier">BOOST_TYPE_INDEX_NO_BASE_CLASS</span><span class="special">)</span> <span class="special">};</span> 185 186<span class="keyword">void</span> <span class="identifier">print_real_type</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">A</span><span class="special">&</span> <span class="identifier">a</span><span class="special">)</span> <span class="special">{</span> 187 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">type_id_runtime</span><span class="special">(</span><span class="identifier">a</span><span class="special">).</span><span class="identifier">pretty_name</span><span class="special">()</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 188<span class="special">}</span> 189 190<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 191 <span class="identifier">C</span> <span class="identifier">c</span><span class="special">;</span> 192 <span class="keyword">const</span> <span class="identifier">A</span><span class="special">&</span> <span class="identifier">c_as_a</span> <span class="special">=</span> <span class="identifier">c</span><span class="special">;</span> 193 <span class="identifier">print_real_type</span><span class="special">(</span><span class="identifier">c_as_a</span><span class="special">);</span> <span class="comment">// Outputs `struct C`</span> 194 <span class="identifier">print_real_type</span><span class="special">(</span><span class="identifier">B</span><span class="special">());</span> <span class="comment">// Outputs `struct B`</span> 195</pre> 196<p> 197 It's also possible to use type_id_runtime with the BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS, 198 which adds additional information for runtime_cast to work. 199 </p> 200<pre class="programlisting"> <span class="identifier">D</span> <span class="identifier">d</span><span class="special">;</span> 201 <span class="keyword">const</span> <span class="identifier">A</span><span class="special">&</span> <span class="identifier">d_as_a</span> <span class="special">=</span> <span class="identifier">d</span><span class="special">;</span> 202 <span class="identifier">print_real_type</span><span class="special">(</span><span class="identifier">d_as_a</span><span class="special">);</span> <span class="comment">// Outputs `struct D`</span> 203 204<span class="special">}</span> 205</pre> 206</div> 207<div class="section"> 208<div class="titlepage"><div><div><h3 class="title"> 209<a name="boost_typeindex.examples.using_runtime_cast_where_rtti_is"></a><a class="link" href="examples.html#boost_typeindex.examples.using_runtime_cast_where_rtti_is" title="Using runtime_cast where RTTI is unavailable or undesirable">Using 210 runtime_cast where RTTI is unavailable or undesirable </a> 211</h3></div></div></div> 212<p> 213 The following example shows that <code class="computeroutput"><span class="identifier">runtime_cast</span></code> 214 is able to find a valid pointer in various class hierarchies regardless of 215 inheritance or type relation. 216 </p> 217<p> 218 Example works with and without RTTI." 219 </p> 220<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_index</span><span class="special">/</span><span class="identifier">runtime_cast</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 221<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 222 223<span class="keyword">struct</span> <span class="identifier">A</span> <span class="special">{</span> 224 <span class="identifier">BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS</span><span class="special">(</span><span class="identifier">BOOST_TYPE_INDEX_NO_BASE_CLASS</span><span class="special">)</span> 225 <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">A</span><span class="special">()</span> 226 <span class="special">{}</span> 227<span class="special">};</span> 228 229<span class="keyword">struct</span> <span class="identifier">B</span> <span class="special">{</span> 230 <span class="identifier">BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS</span><span class="special">(</span><span class="identifier">BOOST_TYPE_INDEX_NO_BASE_CLASS</span><span class="special">)</span> 231 <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">B</span><span class="special">()</span> 232 <span class="special">{}</span> 233<span class="special">};</span> 234 235<span class="keyword">struct</span> <span class="identifier">C</span> <span class="special">:</span> <span class="identifier">A</span> <span class="special">{</span> 236 <span class="identifier">BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS</span><span class="special">((</span><span class="identifier">A</span><span class="special">))</span> 237<span class="special">};</span> 238 239<span class="keyword">struct</span> <span class="identifier">D</span> <span class="special">:</span> <span class="identifier">B</span> <span class="special">{</span> 240 <span class="identifier">BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS</span><span class="special">((</span><span class="identifier">B</span><span class="special">))</span> 241<span class="special">};</span> 242 243<span class="keyword">struct</span> <span class="identifier">E</span> <span class="special">:</span> <span class="identifier">C</span><span class="special">,</span> <span class="identifier">D</span> <span class="special">{</span> 244 <span class="identifier">BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS</span><span class="special">((</span><span class="identifier">C</span><span class="special">)(</span><span class="identifier">D</span><span class="special">))</span> 245<span class="special">};</span> 246 247<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 248 <span class="identifier">C</span> <span class="identifier">c</span><span class="special">;</span> 249 <span class="identifier">A</span><span class="special">*</span> <span class="identifier">a</span> <span class="special">=</span> <span class="special">&</span><span class="identifier">c</span><span class="special">;</span> 250 251 <span class="keyword">if</span><span class="special">(</span><span class="identifier">C</span><span class="special">*</span> <span class="identifier">cp</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">runtime_cast</span><span class="special"><</span><span class="identifier">C</span><span class="special">*>(</span><span class="identifier">a</span><span class="special">))</span> <span class="special">{</span> 252 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Yes, a points to a C: "</span> 253 <span class="special"><<</span> <span class="identifier">a</span> <span class="special"><<</span> <span class="string">"->"</span> <span class="special"><<</span> <span class="identifier">cp</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 254 <span class="special">}</span> 255 <span class="keyword">else</span> <span class="special">{</span> 256 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Error: Expected a to point to a C"</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 257 <span class="special">}</span> 258 259 <span class="keyword">if</span><span class="special">(</span><span class="identifier">E</span><span class="special">*</span> <span class="identifier">ce</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">runtime_cast</span><span class="special"><</span><span class="identifier">E</span><span class="special">*>(</span><span class="identifier">a</span><span class="special">))</span> <span class="special">{</span> 260 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Error: Expected a to not points to an E: "</span> 261 <span class="special"><<</span> <span class="identifier">a</span> <span class="special"><<</span> <span class="string">"->"</span> <span class="special"><<</span> <span class="identifier">ce</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 262 <span class="special">}</span> 263 <span class="keyword">else</span> <span class="special">{</span> 264 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"But, a does not point to an E"</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 265 <span class="special">}</span> 266 267 <span class="identifier">E</span> <span class="identifier">e</span><span class="special">;</span> 268 <span class="identifier">C</span><span class="special">*</span> <span class="identifier">cp2</span> <span class="special">=</span> <span class="special">&</span><span class="identifier">e</span><span class="special">;</span> 269 <span class="keyword">if</span><span class="special">(</span><span class="identifier">D</span><span class="special">*</span> <span class="identifier">dp</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">runtime_cast</span><span class="special"><</span><span class="identifier">D</span><span class="special">*>(</span><span class="identifier">cp2</span><span class="special">))</span> <span class="special">{</span> 270 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Yes, we can cross-cast from a C* to a D* when we actually have an E: "</span> 271 <span class="special"><<</span> <span class="identifier">cp2</span> <span class="special"><<</span> <span class="string">"->"</span> <span class="special"><<</span> <span class="identifier">dp</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 272 <span class="special">}</span> 273 <span class="keyword">else</span> <span class="special">{</span> 274 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Error: Expected cp to point to a D"</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 275 <span class="special">}</span> 276</pre> 277<p> 278 Alternatively, we can use runtime_pointer_cast so we don't need to specity 279 the target as a pointer. This works for smart_ptr types too. 280 </p> 281<pre class="programlisting"> <span class="identifier">A</span><span class="special">*</span> <span class="identifier">ap</span> <span class="special">=</span> <span class="special">&</span><span class="identifier">e</span><span class="special">;</span> 282 <span class="keyword">if</span><span class="special">(</span><span class="identifier">B</span><span class="special">*</span> <span class="identifier">bp</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">runtime_pointer_cast</span><span class="special"><</span><span class="identifier">B</span><span class="special">>(</span><span class="identifier">ap</span><span class="special">))</span> <span class="special">{</span> 283 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Yes, we can cross-cast and up-cast at the same time."</span> 284 <span class="special"><<</span> <span class="identifier">ap</span> <span class="special"><<</span> <span class="string">"->"</span> <span class="special"><<</span> <span class="identifier">bp</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 285 <span class="special">}</span> 286 <span class="keyword">else</span> <span class="special">{</span> 287 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Error: Expected ap to point to a B"</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 288 <span class="special">}</span> 289 290 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> 291<span class="special">}</span> 292</pre> 293</div> 294<div class="section"> 295<div class="titlepage"><div><div><h3 class="title"> 296<a name="boost_typeindex.examples.exact_type_matching_storing_type"></a><a class="link" href="examples.html#boost_typeindex.examples.exact_type_matching_storing_type" title="Exact type matching: storing type with const, volatile and reference qualifiers">Exact 297 type matching: storing type with const, volatile and reference qualifiers</a> 298</h3></div></div></div> 299<p> 300 The following example shows that <code class="computeroutput"><span class="identifier">type_index</span></code> 301 (and <code class="computeroutput"><span class="identifier">type_info</span></code>) is able to 302 store the exact type, without stripping const, volatile and references. Example 303 works with and without RTTI. 304 </p> 305<p> 306 In this example we'll create a class that stores a pointer to function and 307 remembers the exact type of the parameter the function accepts. When the 308 call to the bound function is made, he actual input parameter type is checked 309 against the stored parameter type and an exception is thrown in case of mismatch. 310 </p> 311<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_index</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 312<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 313<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">stdexcept</span><span class="special">></span> 314<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cstdlib</span><span class="special">></span> 315 316<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span> 317 318<span class="keyword">class</span> <span class="identifier">type_erased_unary_function</span> <span class="special">{</span> 319 <span class="keyword">void</span><span class="special">*</span> <span class="identifier">function_ptr_</span><span class="special">;</span> 320 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">type_index</span> <span class="identifier">exact_param_t_</span><span class="special">;</span> 321 322<span class="keyword">public</span><span class="special">:</span> 323 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">ParamT</span><span class="special">></span> 324 <span class="identifier">type_erased_unary_function</span><span class="special">(</span><span class="keyword">void</span><span class="special">(*</span><span class="identifier">ptr</span><span class="special">)(</span><span class="identifier">ParamT</span><span class="special">))</span> 325 <span class="special">:</span> <span class="identifier">function_ptr_</span><span class="special">(</span><span class="keyword">reinterpret_cast</span><span class="special"><</span><span class="keyword">void</span><span class="special">*>(</span><span class="identifier">ptr</span><span class="special">))</span> <span class="comment">// ptr - is a pointer to function returning `void` and accepting parameter of type `ParamT`</span> 326 <span class="special">,</span> <span class="identifier">exact_param_t_</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">type_id_with_cvr</span><span class="special"><</span><span class="identifier">ParamT</span><span class="special">>())</span> 327 <span class="special">{}</span> 328 329 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">ParamT</span><span class="special">></span> 330 <span class="keyword">void</span> <span class="identifier">call</span><span class="special">(</span><span class="identifier">ParamT</span> <span class="identifier">v</span><span class="special">)</span> <span class="special">{</span> 331 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">exact_param_t_</span> <span class="special">!=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">type_id_with_cvr</span><span class="special"><</span><span class="identifier">ParamT</span><span class="special">>())</span> <span class="special">{</span> 332 <span class="keyword">throw</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">runtime_error</span><span class="special">(</span><span class="string">"Incorrect `ParamT`"</span><span class="special">);</span> 333 <span class="special">}</span> 334 335 <span class="keyword">return</span> <span class="special">(</span><span class="keyword">reinterpret_cast</span><span class="special"><</span><span class="keyword">void</span><span class="special">(*)(</span><span class="identifier">ParamT</span><span class="special">)>(</span><span class="identifier">function_ptr_</span><span class="special">))(</span><span class="identifier">v</span><span class="special">);</span> 336 <span class="special">}</span> 337<span class="special">};</span> 338 339<span class="keyword">void</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">int</span><span class="special">){}</span> 340 341<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 342 <span class="identifier">type_erased_unary_function</span> <span class="identifier">func</span><span class="special">(&</span><span class="identifier">foo</span><span class="special">);</span> 343 <span class="identifier">func</span><span class="special">.</span><span class="identifier">call</span><span class="special">(</span><span class="number">100</span><span class="special">);</span> <span class="comment">// OK, `100` has type `int`</span> 344 345 <span class="keyword">try</span> <span class="special">{</span> 346 <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">100</span><span class="special">;</span> 347 348 <span class="comment">// An attempt to convert stored function to a function accepting reference</span> 349 <span class="identifier">func</span><span class="special">.</span><span class="identifier">call</span><span class="special"><</span><span class="keyword">int</span><span class="special">&>(</span><span class="identifier">i</span><span class="special">);</span> <span class="comment">// Will throw, because types `int&` and `int` mismatch</span> 350 351 <span class="identifier">assert</span><span class="special">(</span><span class="keyword">false</span><span class="special">);</span> 352 <span class="special">}</span> <span class="keyword">catch</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">runtime_error</span><span class="special">&</span> <span class="comment">/*e*/</span><span class="special">)</span> <span class="special">{}</span> 353<span class="special">}</span> 354</pre> 355</div> 356<div class="section"> 357<div class="titlepage"><div><div><h3 class="title"> 358<a name="boost_typeindex.examples.table_of_raw_name_and_pretty_nam"></a><a class="link" href="examples.html#boost_typeindex.examples.table_of_raw_name_and_pretty_nam" title="Table of raw_name() and pretty_name() outputs with and without RTTI">Table 359 of raw_name() and pretty_name() outputs with and without RTTI </a> 360</h3></div></div></div> 361<p> 362 The following example shows how different type names look when we explicitly 363 use classes for RTTI and RTT off. 364 </p> 365<p> 366 This example requires RTTI. For a more portable example see 'Getting human 367 readable and mangled type names': 368 </p> 369<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_index</span><span class="special">/</span><span class="identifier">stl_type_index</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 370<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_index</span><span class="special">/</span><span class="identifier">ctti_type_index</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 371<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 372 373<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> 374<span class="keyword">void</span> <span class="identifier">print</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">name</span><span class="special">)</span> <span class="special">{</span> 375 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">stl_type_index</span> <span class="identifier">sti</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">stl_type_index</span><span class="special">::</span><span class="identifier">type_id</span><span class="special"><</span><span class="identifier">T</span><span class="special">>();</span> 376 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">ctti_type_index</span> <span class="identifier">cti</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">ctti_type_index</span><span class="special">::</span><span class="identifier">type_id</span><span class="special"><</span><span class="identifier">T</span><span class="special">>();</span> 377 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\t["</span> <span class="comment">/* start of the row */</span> 378 <span class="special"><<</span> <span class="string">"["</span> <span class="special"><<</span> <span class="identifier">name</span> <span class="special"><<</span> <span class="string">"]"</span> 379 <span class="special"><<</span> <span class="string">"[`"</span> <span class="special"><<</span> <span class="identifier">sti</span><span class="special">.</span><span class="identifier">raw_name</span><span class="special">()</span> <span class="special"><<</span> <span class="string">"`] "</span> 380 <span class="special"><<</span> <span class="string">"[`"</span> <span class="special"><<</span> <span class="identifier">sti</span><span class="special">.</span><span class="identifier">pretty_name</span><span class="special">()</span> <span class="special"><<</span> <span class="string">"`] "</span> 381 <span class="special"><<</span> <span class="string">"[`"</span> <span class="special"><<</span> <span class="identifier">cti</span><span class="special">.</span><span class="identifier">raw_name</span><span class="special">()</span> <span class="special"><<</span> <span class="string">"`] "</span> 382 <span class="special"><<</span> <span class="string">"]\n"</span> <span class="comment">/* end of the row */</span> <span class="special">;</span> 383<span class="special">}</span> 384 385<span class="keyword">struct</span> <span class="identifier">user_defined_type</span><span class="special">{};</span> 386 387<span class="keyword">namespace</span> <span class="identifier">ns1</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">ns2</span> <span class="special">{</span> 388 <span class="keyword">struct</span> <span class="identifier">user_defined_type</span><span class="special">{};</span> 389<span class="special">}}</span> <span class="comment">// namespace ns1::ns2</span> 390 391<span class="keyword">namespace</span> <span class="special">{</span> 392 <span class="keyword">struct</span> <span class="identifier">in_anon_type</span><span class="special">{};</span> 393<span class="special">}</span> <span class="comment">// anonymous namespace</span> 394 395<span class="keyword">namespace</span> <span class="identifier">ns3</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">ns4</span> <span class="special">{</span> 396 <span class="keyword">struct</span> <span class="identifier">in_anon_type</span><span class="special">{};</span> 397<span class="special">}}}</span> <span class="comment">// namespace ns3::{anonymous}::ns4</span> 398 399 400<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T0</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T1</span><span class="special">></span> 401<span class="keyword">class</span> <span class="identifier">templ</span> <span class="special">{};</span> 402 403<span class="keyword">template</span> <span class="special"><></span> 404<span class="keyword">class</span> <span class="identifier">templ</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">></span> <span class="special">{};</span> 405 406<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 407 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"[table:id Table of names\n"</span><span class="special">;</span> 408 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\t[[Type] [RTTI & raw_name] [RTTI & pretty_name] [noRTTI & raw_name]]\n"</span><span class="special">;</span> 409 410 <span class="identifier">print</span><span class="special"><</span><span class="identifier">user_defined_type</span><span class="special">>(</span><span class="string">"User defined type"</span><span class="special">);</span> 411 <span class="identifier">print</span><span class="special"><</span><span class="identifier">in_anon_type</span><span class="special">>(</span><span class="string">"In anonymous namespace"</span><span class="special">);</span> 412 <span class="identifier">print</span><span class="special"><</span><span class="identifier">ns3</span><span class="special">::</span><span class="identifier">ns4</span><span class="special">::</span><span class="identifier">in_anon_type</span><span class="special">>(</span><span class="string">"In ns3::{anonymous}::ns4 namespace"</span><span class="special">);</span> 413 <span class="identifier">print</span><span class="special"><</span><span class="identifier">templ</span><span class="special"><</span><span class="keyword">short</span><span class="special">,</span> <span class="keyword">int</span><span class="special">></span> <span class="special">>(</span><span class="string">"Template class"</span><span class="special">);</span> 414 <span class="identifier">print</span><span class="special"><</span><span class="identifier">templ</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">></span> <span class="special">>(</span><span class="string">"Template class (full specialization)"</span><span class="special">);</span> 415 <span class="identifier">print</span><span class="special"><</span><span class="identifier">templ</span><span class="special"><</span> 416 <span class="identifier">templ</span><span class="special"><</span><span class="keyword">char</span><span class="special">,</span> <span class="keyword">signed</span> <span class="keyword">char</span><span class="special">>,</span> 417 <span class="identifier">templ</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">user_defined_type</span><span class="special">></span> 418 <span class="special">></span> <span class="special">>(</span><span class="string">"Template class with templae classes"</span><span class="special">);</span> 419 420 421 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"]\n"</span><span class="special">;</span> 422<span class="special">}</span> 423</pre> 424<p> 425 Code from the example will produce the following table: 426 </p> 427<div class="table"> 428<a name="boost_typeindex.examples.table_of_raw_name_and_pretty_nam.id"></a><p class="title"><b>Table 41.2. Table of names</b></p> 429<div class="table-contents"><table class="table" summary="Table of names"> 430<colgroup> 431<col> 432<col> 433<col> 434<col> 435</colgroup> 436<thead><tr> 437<th> 438 <p> 439 Type 440 </p> 441 </th> 442<th> 443 <p> 444 RTTI & raw_name 445 </p> 446 </th> 447<th> 448 <p> 449 RTTI & pretty_name 450 </p> 451 </th> 452<th> 453 <p> 454 noRTTI & raw_name 455 </p> 456 </th> 457</tr></thead> 458<tbody> 459<tr> 460<td> 461 <p> 462 User defined type 463 </p> 464 </td> 465<td> 466 <p> 467 <code class="computeroutput"><span class="number">17u</span><span class="identifier">ser_defined_type</span></code> 468 </p> 469 </td> 470<td> 471 <p> 472 <code class="computeroutput"><span class="identifier">user_defined_type</span></code> 473 </p> 474 </td> 475<td> 476 <p> 477 <code class="computeroutput"><span class="identifier">user_defined_type</span><span class="special">]</span></code> 478 </p> 479 </td> 480</tr> 481<tr> 482<td> 483 <p> 484 In anonymous namespace 485 </p> 486 </td> 487<td> 488 <p> 489 <code class="computeroutput"><span class="identifier">N12_GLOBAL__N_112in_anon_typeE</span></code> 490 </p> 491 </td> 492<td> 493 <p> 494 <code class="computeroutput"><span class="special">(</span><span class="identifier">anonymous</span> 495 <span class="keyword">namespace</span><span class="special">)::</span><span class="identifier">in_anon_type</span></code> 496 </p> 497 </td> 498<td> 499 <p> 500 <code class="computeroutput"><span class="special">{</span><span class="identifier">anonymous</span><span class="special">}::</span><span class="identifier">in_anon_type</span><span class="special">]</span></code> 501 </p> 502 </td> 503</tr> 504<tr> 505<td> 506 <p> 507 In ns3::{anonymous}::ns4 namespace 508 </p> 509 </td> 510<td> 511 <p> 512 <code class="computeroutput"><span class="identifier">N3ns312_GLOBAL__N_13ns412in_anon_typeE</span></code> 513 </p> 514 </td> 515<td> 516 <p> 517 <code class="computeroutput"><span class="identifier">ns3</span><span class="special">::(</span><span class="identifier">anonymous</span> <span class="keyword">namespace</span><span class="special">)::</span><span class="identifier">ns4</span><span class="special">::</span><span class="identifier">in_anon_type</span></code> 518 </p> 519 </td> 520<td> 521 <p> 522 <code class="computeroutput"><span class="identifier">ns3</span><span class="special">::{</span><span class="identifier">anonymous</span><span class="special">}::</span><span class="identifier">ns4</span><span class="special">::</span><span class="identifier">in_anon_type</span><span class="special">]</span></code> 523 </p> 524 </td> 525</tr> 526<tr> 527<td> 528 <p> 529 Template class 530 </p> 531 </td> 532<td> 533 <p> 534 <code class="computeroutput"><span class="number">5</span><span class="identifier">templIsiE</span></code> 535 </p> 536 </td> 537<td> 538 <p> 539 <code class="computeroutput"><span class="identifier">templ</span><span class="special"><</span><span class="keyword">short</span><span class="special">,</span> 540 <span class="keyword">int</span><span class="special">></span></code> 541 </p> 542 </td> 543<td> 544 <p> 545 <code class="computeroutput"><span class="identifier">templ</span><span class="special"><</span><span class="keyword">short</span> <span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">>]</span></code> 546 </p> 547 </td> 548</tr> 549<tr> 550<td> 551 <p> 552 Template class (full specialization) 553 </p> 554 </td> 555<td> 556 <p> 557 <code class="computeroutput"><span class="number">5</span><span class="identifier">templIiiE</span></code> 558 </p> 559 </td> 560<td> 561 <p> 562 <code class="computeroutput"><span class="identifier">templ</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">></span></code> 563 </p> 564 </td> 565<td> 566 <p> 567 <code class="computeroutput"><span class="identifier">templ</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">>]</span></code> 568 </p> 569 </td> 570</tr> 571<tr> 572<td> 573 <p> 574 Template class with template classes 575 </p> 576 </td> 577<td> 578 <p> 579 <code class="computeroutput"><span class="number">5</span><span class="identifier">templIS_IcaES_Ii17user_defined_typeEE</span></code> 580 </p> 581 </td> 582<td> 583 <p> 584 <code class="computeroutput"><span class="identifier">templ</span><span class="special"><</span><span class="identifier">templ</span><span class="special"><</span><span class="keyword">char</span><span class="special">,</span> 585 <span class="keyword">signed</span> <span class="keyword">char</span><span class="special">>,</span> <span class="identifier">templ</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">user_defined_type</span><span class="special">></span> <span class="special">></span></code> 586 </p> 587 </td> 588<td> 589 <p> 590 <code class="computeroutput"><span class="identifier">templ</span><span class="special"><</span><span class="identifier">templ</span><span class="special"><</span><span class="keyword">char</span><span class="special">,</span> 591 <span class="keyword">signed</span> <span class="keyword">char</span><span class="special">>,</span> <span class="identifier">templ</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">user_defined_type</span><span class="special">></span> <span class="special">>]</span></code> 592 </p> 593 </td> 594</tr> 595</tbody> 596</table></div> 597</div> 598<br class="table-break"><p> 599 We have not show the "noRTTI & pretty_name" column in the table 600 because it is almost equal to "noRTTI & raw_name" column. 601 </p> 602<div class="warning"><table border="0" summary="Warning"> 603<tr> 604<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 605<th align="left">Warning</th> 606</tr> 607<tr><td align="left" valign="top"><p> 608 With RTTI off different classes with same names in anonymous namespace 609 may collapse. See 'RTTI emulation limitations'. 610 </p></td></tr> 611</table></div> 612</div> 613<div class="section"> 614<div class="titlepage"><div><div><h3 class="title"> 615<a name="boost_typeindex.examples.c_14_checking_namespace_at_compi"></a><a class="link" href="examples.html#boost_typeindex.examples.c_14_checking_namespace_at_compi" title="C++14: Checking namespace at compile time">C++14: 616 Checking namespace at compile time </a> 617</h3></div></div></div> 618<p> 619 The following example shows that <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">ctti_type_index</span></code> 620 is usable at compile time on a C++14 compatible compilers. 621 </p> 622<p> 623 In this example we'll create and use a constexpr function that checks namespace 624 of the provided type. 625 </p> 626<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_index</span><span class="special">/</span><span class="identifier">ctti_type_index</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 627 628<span class="comment">// Helper function that returns true if `name` starts with `substr`</span> 629<span class="keyword">template</span> <span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">></span> 630<span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">starts_with</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">(&</span><span class="identifier">substr</span><span class="special">)[</span><span class="identifier">N</span><span class="special">])</span> <span class="keyword">noexcept</span><span class="special">;</span> 631 632 633<span class="comment">// Function that returns true if `T` declared in namespace `ns`</span> 634<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">></span> 635<span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">in_namespace</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span> <span class="special">(&</span><span class="identifier">ns</span><span class="special">)[</span><span class="identifier">N</span><span class="special">])</span> <span class="keyword">noexcept</span> <span class="special">{</span> 636 <span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">name</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">ctti_type_index</span><span class="special">::</span><span class="identifier">type_id</span><span class="special"><</span><span class="identifier">T</span><span class="special">>().</span><span class="identifier">raw_name</span><span class="special">();</span> 637 638 <span class="comment">// Some compilers add `class ` or `struct ` before the namespace, so we need to skip those words first</span> 639 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">starts_with</span><span class="special">(</span><span class="identifier">name</span><span class="special">,</span> <span class="string">"class "</span><span class="special">))</span> <span class="special">{</span> 640 <span class="identifier">name</span> <span class="special">+=</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="string">"class "</span><span class="special">)</span> <span class="special">-</span> <span class="number">1</span><span class="special">;</span> 641 <span class="special">}</span> <span class="keyword">else</span> <span class="keyword">if</span> <span class="special">(</span><span class="identifier">starts_with</span><span class="special">(</span><span class="identifier">name</span><span class="special">,</span> <span class="string">"struct "</span><span class="special">))</span> <span class="special">{</span> 642 <span class="identifier">name</span> <span class="special">+=</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="string">"struct "</span><span class="special">)</span> <span class="special">-</span> <span class="number">1</span><span class="special">;</span> 643 <span class="special">}</span> 644 645 <span class="keyword">return</span> <span class="identifier">starts_with</span><span class="special">(</span><span class="identifier">name</span><span class="special">,</span> <span class="identifier">ns</span><span class="special">)</span> <span class="special">&&</span> <span class="identifier">starts_with</span><span class="special">(</span><span class="identifier">name</span> <span class="special">+</span> <span class="identifier">N</span> <span class="special">-</span> <span class="number">1</span><span class="special">,</span> <span class="string">"::"</span><span class="special">);</span> 646<span class="special">}</span> 647</pre> 648<p> 649 Now when we have that wonderfull function, we can do static assertions and 650 other compile-time validations: 651 </p> 652<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">my_project</span> <span class="special">{</span> 653 <span class="keyword">struct</span> <span class="identifier">serializer</span> <span class="special">{</span> 654 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> 655 <span class="keyword">void</span> <span class="identifier">serialize</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">value</span><span class="special">)</span> <span class="special">{</span> 656 <span class="keyword">static_assert</span><span class="special">(</span> 657 <span class="identifier">in_namespace</span><span class="special"><</span><span class="identifier">T</span><span class="special">>(</span><span class="string">"my_project::types"</span><span class="special">)</span> <span class="special">||</span> <span class="identifier">in_namespace</span><span class="special"><</span><span class="identifier">T</span><span class="special">>(</span><span class="string">"my_project::types_ext"</span><span class="special">),</span> 658 <span class="string">"Only types from namespaces `my_project::types` and `my_project::types_ext` are allowed to be serialized using `my_project::serializer`"</span> 659 <span class="special">);</span> 660 661 <span class="comment">// Actual implementation of the serialization goes below</span> 662 <span class="comment">// ...</span> 663 <span class="identifier">do_something</span><span class="special">(</span><span class="identifier">value</span><span class="special">);</span> 664 <span class="special">}</span> 665 <span class="special">};</span> 666 667 <span class="keyword">namespace</span> <span class="identifier">types</span> <span class="special">{</span> 668 <span class="keyword">struct</span> <span class="identifier">foo</span><span class="special">{};</span> 669 <span class="keyword">struct</span> <span class="identifier">bar</span><span class="special">{};</span> 670 <span class="special">}</span> 671<span class="special">}</span> <span class="comment">// namespace my_project</span> 672 673<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 674 <span class="identifier">my_project</span><span class="special">::</span><span class="identifier">serializer</span> <span class="identifier">s</span><span class="special">;</span> 675 <span class="identifier">my_project</span><span class="special">::</span><span class="identifier">types</span><span class="special">::</span><span class="identifier">foo</span> <span class="identifier">f</span><span class="special">;</span> 676 <span class="identifier">my_project</span><span class="special">::</span><span class="identifier">types</span><span class="special">::</span><span class="identifier">bar</span> <span class="identifier">b</span><span class="special">;</span> 677 678 <span class="identifier">s</span><span class="special">.</span><span class="identifier">serialize</span><span class="special">(</span><span class="identifier">f</span><span class="special">);</span> 679 <span class="identifier">s</span><span class="special">.</span><span class="identifier">serialize</span><span class="special">(</span><span class="identifier">b</span><span class="special">);</span> 680 681 <span class="comment">// short sh = 0;</span> 682 <span class="comment">// s.serialize(sh); // Fails the static_assert!</span> 683<span class="special">}</span> 684</pre> 685</div> 686<div class="section"> 687<div class="titlepage"><div><div><h3 class="title"> 688<a name="boost_typeindex.examples.c_14_checking_lexigraphical_orde"></a><a class="link" href="examples.html#boost_typeindex.examples.c_14_checking_lexigraphical_orde" title="C++14: Checking lexigraphical order of provided types">C++14: 689 Checking lexigraphical order of provided types </a> 690</h3></div></div></div> 691<p> 692 The following example shows that <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">ctti_type_index</span></code> 693 is usable at compile time on a C++14 compatible compilers to check order 694 of template parameters. 695 </p> 696<p> 697 Consider the situation when we have a function that accepts std::tuple, boost::variant 698 or some other class that uses variadic templates: 699 </p> 700<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">class</span> <span class="identifier">types</span><span class="special">{};</span> 701 702<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">T</span><span class="special">></span> 703<span class="keyword">void</span> <span class="identifier">do_something</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">types</span><span class="special"><</span><span class="identifier">T</span><span class="special">...>&</span> <span class="identifier">t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 704</pre> 705<p> 706 Such functions may be very usefull, however they may significantly increase 707 the size of the resulting program. Each instantionation of such function 708 with different templates order consumes space in the resulting program: 709 </p> 710<pre class="programlisting"><span class="comment">// Types are same, but different order leads to new instantionation of do_something function.</span> 711<span class="identifier">types</span><span class="special"><</span><span class="keyword">bool</span><span class="special">,</span> <span class="keyword">double</span><span class="special">,</span> <span class="keyword">int</span><span class="special">></span> 712<span class="identifier">types</span><span class="special"><</span><span class="keyword">bool</span><span class="special">,</span> <span class="keyword">int</span><span class="special">,</span> <span class="keyword">double</span><span class="special">></span> 713<span class="identifier">types</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">bool</span><span class="special">,</span> <span class="keyword">double</span><span class="special">></span> 714<span class="identifier">types</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">double</span><span class="special">,</span> <span class="keyword">bool</span><span class="special">></span> 715<span class="identifier">types</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span> <span class="keyword">int</span><span class="special">,</span> <span class="keyword">bool</span><span class="special">></span> 716<span class="identifier">types</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span> <span class="keyword">bool</span><span class="special">,</span> <span class="keyword">int</span><span class="special">></span> 717</pre> 718<p> 719 One of the ways to reduce instantinations count is to force the types to 720 have some order: 721 </p> 722<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_index</span><span class="special">/</span><span class="identifier">ctti_type_index</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 723 724<span class="comment">// Implementing type trait that returns true if the types are sorted lexographicaly</span> 725<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">T</span><span class="special">></span> 726<span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_asc_sorted</span><span class="special">(</span><span class="identifier">types</span><span class="special"><</span><span class="identifier">T</span><span class="special">...>)</span> <span class="keyword">noexcept</span> <span class="special">{</span> 727 <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> 728<span class="special">}</span> 729 730<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lhs</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">TN</span><span class="special">></span> 731<span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_asc_sorted</span><span class="special">(</span><span class="identifier">types</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="identifier">TN</span><span class="special">...>)</span> <span class="keyword">noexcept</span> <span class="special">{</span> 732 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">;</span> 733 <span class="keyword">return</span> <span class="identifier">ctti_type_index</span><span class="special">::</span><span class="identifier">type_id</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">>()</span> <span class="special"><=</span> <span class="identifier">ctti_type_index</span><span class="special">::</span><span class="identifier">type_id</span><span class="special"><</span><span class="identifier">Rhs</span><span class="special">>()</span> 734 <span class="special">&&</span> <span class="identifier">is_asc_sorted</span><span class="special">(</span><span class="identifier">types</span><span class="special"><</span><span class="identifier">Rhs</span><span class="special">,</span> <span class="identifier">TN</span><span class="special">...>());</span> 735<span class="special">}</span> 736 737 738<span class="comment">// Using the newly created `is_asc_sorted` trait:</span> 739<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">T</span><span class="special">></span> 740<span class="keyword">void</span> <span class="identifier">do_something</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">types</span><span class="special"><</span><span class="identifier">T</span><span class="special">...>&</span> <span class="comment">/*value*/</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">{</span> 741 <span class="keyword">static_assert</span><span class="special">(</span> 742 <span class="identifier">is_asc_sorted</span><span class="special">(</span> <span class="identifier">types</span><span class="special"><</span><span class="identifier">T</span><span class="special">...>()</span> <span class="special">),</span> 743 <span class="string">"T... for do_something(const types<T...>& t) must be sorted ascending"</span> 744 <span class="special">);</span> 745<span class="special">}</span> 746 747<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 748 <span class="identifier">do_something</span><span class="special">(</span> <span class="identifier">types</span><span class="special"><</span><span class="keyword">bool</span><span class="special">,</span> <span class="keyword">double</span><span class="special">,</span> <span class="keyword">int</span><span class="special">>()</span> <span class="special">);</span> 749 <span class="comment">// do_something( types<bool, int, double>() ); // Fails the static_assert!</span> 750<span class="special">}</span> 751</pre> 752</div> 753</div> 754<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 755<td align="left"></td> 756<td align="right"><div class="copyright-footer">Copyright © 2012-2020 Antony 757 Polukhin<p> 758 Distributed under the Boost Software License, Version 1.0. (See accompanying 759 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>) 760 </p> 761</div></td> 762</tr></table> 763<hr> 764<div class="spirit-nav"> 765<a accesskey="p" href="how_it_works.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_typeindex.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_typeindex_header_reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 766</div> 767</body> 768</html> 769