1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
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">
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>
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>
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>
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>
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.
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>
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>
66 <span class="keyword">struct</span> <span class="identifier">user_defined_type</span><span class="special">{};</span>
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>
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>
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>
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>
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>
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>
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>.
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>.
118 <div class="warning"><table border="0" summary="Warning">
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>
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'.
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>
135 The following example shows how an information about a type could be stored.
136 Example works with and without RTTI.
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_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">boost</span><span class="special">/</span><span class="identifier">functional</span><span class="special">/</span><span class="identifier">hash</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
141 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span>
143 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
144 <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>
146 <span class="comment">// Storing some `boost::type_info`s</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">int</span><span class="special">>());</span>
148 <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>
150 <span class="comment">// `types` variable contains two `boost::type_index`es:</span>
151 <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>
153 <span class="comment">// Const, volatile and reference will be striped from the type:</span>
154 <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>
155 <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">is_inserted</span><span class="special">);</span>
156 <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>
158 <span class="comment">// We have erased the `float` type, only `int` remains</span>
159 <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>
160 <span class="special">}</span>
163 <div class="section">
164 <div class="titlepage"><div><div><h3 class="title">
165 <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
166 through the inheritance to receive a real type name </a>
167 </h3></div></div></div>
169 The following example shows that <code class="computeroutput"><span class="identifier">type_info</span></code>
170 is able to store the real type, successfully getting through all the inheritances.
173 Example works with and without RTTI."
175 <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>
176 <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>
177 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
179 <span class="keyword">struct</span> <span class="identifier">A</span> <span class="special">{</span>
180 <span class="identifier">BOOST_TYPE_INDEX_REGISTER_CLASS</span>
181 <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">A</span><span class="special">(){}</span>
182 <span class="special">};</span>
183 <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>
184 <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>
185 <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>
187 <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>
188 <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>
189 <span class="special">}</span>
191 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
192 <span class="identifier">C</span> <span class="identifier">c</span><span class="special">;</span>
193 <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>
194 <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>
195 <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>
198 It's also possible to use type_id_runtime with the BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS,
199 which adds additional information for runtime_cast to work.
201 <pre class="programlisting"> <span class="identifier">D</span> <span class="identifier">d</span><span class="special">;</span>
202 <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>
203 <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>
205 <span class="special">}</span>
208 <div class="section">
209 <div class="titlepage"><div><div><h3 class="title">
210 <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
211 runtime_cast where RTTI is unavailable or undesirable </a>
212 </h3></div></div></div>
214 The following example shows that <code class="computeroutput"><span class="identifier">runtime_cast</span></code>
215 is able to find a valid pointer in various class hierarchies regardless of
216 inheritance or type relation.
219 Example works with and without RTTI."
221 <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>
222 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
224 <span class="keyword">struct</span> <span class="identifier">A</span> <span class="special">{</span>
225 <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>
226 <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">A</span><span class="special">()</span>
227 <span class="special">{}</span>
228 <span class="special">};</span>
230 <span class="keyword">struct</span> <span class="identifier">B</span> <span class="special">{</span>
231 <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>
232 <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">B</span><span class="special">()</span>
233 <span class="special">{}</span>
234 <span class="special">};</span>
236 <span class="keyword">struct</span> <span class="identifier">C</span> <span class="special">:</span> <span class="identifier">A</span> <span class="special">{</span>
237 <span class="identifier">BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS</span><span class="special">((</span><span class="identifier">A</span><span class="special">))</span>
238 <span class="special">};</span>
240 <span class="keyword">struct</span> <span class="identifier">D</span> <span class="special">:</span> <span class="identifier">B</span> <span class="special">{</span>
241 <span class="identifier">BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS</span><span class="special">((</span><span class="identifier">B</span><span class="special">))</span>
242 <span class="special">};</span>
244 <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>
245 <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>
246 <span class="special">};</span>
248 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
249 <span class="identifier">C</span> <span class="identifier">c</span><span class="special">;</span>
250 <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>
252 <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>
253 <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>
254 <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>
255 <span class="special">}</span>
256 <span class="keyword">else</span> <span class="special">{</span>
257 <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>
258 <span class="special">}</span>
260 <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>
261 <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>
262 <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>
263 <span class="special">}</span>
264 <span class="keyword">else</span> <span class="special">{</span>
265 <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>
266 <span class="special">}</span>
268 <span class="identifier">E</span> <span class="identifier">e</span><span class="special">;</span>
269 <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>
270 <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>
271 <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>
272 <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>
273 <span class="special">}</span>
274 <span class="keyword">else</span> <span class="special">{</span>
275 <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>
276 <span class="special">}</span>
279 Alternatively, we can use runtime_pointer_cast so we don't need to specity
280 the target as a pointer. This works for smart_ptr types too.
282 <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>
283 <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>
284 <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>
285 <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>
286 <span class="special">}</span>
287 <span class="keyword">else</span> <span class="special">{</span>
288 <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>
289 <span class="special">}</span>
291 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
292 <span class="special">}</span>
295 <div class="section">
296 <div class="titlepage"><div><div><h3 class="title">
297 <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
298 type matching: storing type with const, volatile and reference qualifiers</a>
299 </h3></div></div></div>
301 The following example shows that <code class="computeroutput"><span class="identifier">type_index</span></code>
302 (and <code class="computeroutput"><span class="identifier">type_info</span></code>) is able to
303 store the exact type, without stripping const, volatile and references. Example
304 works with and without RTTI.
307 In this example we'll create a class that stores a pointer to function and
308 remembers the exact type of the parameter the function accepts. When the
309 call to the bound function is made, he actual input parameter type is checked
310 against the stored parameter type and an exception is thrown in case of mismatch.
312 <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>
313 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
314 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">stdexcept</span><span class="special">></span>
315 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cstdlib</span><span class="special">></span>
317 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span>
319 <span class="keyword">class</span> <span class="identifier">type_erased_unary_function</span> <span class="special">{</span>
320 <span class="keyword">void</span><span class="special">*</span> <span class="identifier">function_ptr_</span><span class="special">;</span>
321 <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>
323 <span class="keyword">public</span><span class="special">:</span>
324 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">ParamT</span><span class="special">></span>
325 <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>
326 <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>
327 <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>
328 <span class="special">{}</span>
330 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">ParamT</span><span class="special">></span>
331 <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>
332 <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>
333 <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>
334 <span class="special">}</span>
336 <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>
337 <span class="special">}</span>
338 <span class="special">};</span>
340 <span class="keyword">void</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">int</span><span class="special">){}</span>
342 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
343 <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>
344 <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>
346 <span class="keyword">try</span> <span class="special">{</span>
347 <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">100</span><span class="special">;</span>
349 <span class="comment">// An attempt to convert stored function to a function accepting reference</span>
350 <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>
352 <span class="identifier">assert</span><span class="special">(</span><span class="keyword">false</span><span class="special">);</span>
353 <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>
354 <span class="special">}</span>
357 <div class="section">
358 <div class="titlepage"><div><div><h3 class="title">
359 <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
360 of raw_name() and pretty_name() outputs with and without RTTI </a>
361 </h3></div></div></div>
363 The following example shows how different type names look when we explicitly
364 use classes for RTTI and RTT off.
367 This example requires RTTI. For a more portable example see 'Getting human
368 readable and mangled type names':
370 <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>
371 <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>
372 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
374 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
375 <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>
376 <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>
377 <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>
378 <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>
379 <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>
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">raw_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">sti</span><span class="special">.</span><span class="identifier">pretty_name</span><span class="special">()</span> <span class="special"><<</span> <span class="string">"`] "</span>
382 <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>
383 <span class="special"><<</span> <span class="string">"]\n"</span> <span class="comment">/* end of the row */</span> <span class="special">;</span>
384 <span class="special">}</span>
386 <span class="keyword">struct</span> <span class="identifier">user_defined_type</span><span class="special">{};</span>
388 <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>
389 <span class="keyword">struct</span> <span class="identifier">user_defined_type</span><span class="special">{};</span>
390 <span class="special">}}</span> <span class="comment">// namespace ns1::ns2</span>
392 <span class="keyword">namespace</span> <span class="special">{</span>
393 <span class="keyword">struct</span> <span class="identifier">in_anon_type</span><span class="special">{};</span>
394 <span class="special">}</span> <span class="comment">// anonymous namespace</span>
396 <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>
397 <span class="keyword">struct</span> <span class="identifier">in_anon_type</span><span class="special">{};</span>
398 <span class="special">}}}</span> <span class="comment">// namespace ns3::{anonymous}::ns4</span>
401 <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>
402 <span class="keyword">class</span> <span class="identifier">templ</span> <span class="special">{};</span>
404 <span class="keyword">template</span> <span class="special"><></span>
405 <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>
407 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</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">"[table:id Table of names\n"</span><span class="special">;</span>
409 <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>
411 <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>
412 <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>
413 <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>
414 <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>
415 <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>
416 <span class="identifier">print</span><span class="special"><</span><span class="identifier">templ</span><span class="special"><</span>
417 <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>
418 <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>
419 <span class="special">></span> <span class="special">>(</span><span class="string">"Template class with templae classes"</span><span class="special">);</span>
422 <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>
423 <span class="special">}</span>
426 Code from the example will produce the following table:
429 <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>
430 <div class="table-contents"><table class="table" summary="Table of names">
450 RTTI & pretty_name
455 noRTTI & raw_name
468 <code class="computeroutput"><span class="number">17u</span><span class="identifier">ser_defined_type</span></code>
473 <code class="computeroutput"><span class="identifier">user_defined_type</span></code>
478 <code class="computeroutput"><span class="identifier">user_defined_type</span><span class="special">]</span></code>
485 In anonymous namespace
490 <code class="computeroutput"><span class="identifier">N12_GLOBAL__N_112in_anon_typeE</span></code>
495 <code class="computeroutput"><span class="special">(</span><span class="identifier">anonymous</span>
496 <span class="keyword">namespace</span><span class="special">)::</span><span class="identifier">in_anon_type</span></code>
501 <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>
508 In ns3::{anonymous}::ns4 namespace
513 <code class="computeroutput"><span class="identifier">N3ns312_GLOBAL__N_13ns412in_anon_typeE</span></code>
518 <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>
523 <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>
535 <code class="computeroutput"><span class="number">5</span><span class="identifier">templIsiE</span></code>
540 <code class="computeroutput"><span class="identifier">templ</span><span class="special"><</span><span class="keyword">short</span><span class="special">,</span>
541 <span class="keyword">int</span><span class="special">></span></code>
546 <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>
553 Template class (full specialization)
558 <code class="computeroutput"><span class="number">5</span><span class="identifier">templIiiE</span></code>
563 <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 <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>
575 Template class with template classes
580 <code class="computeroutput"><span class="number">5</span><span class="identifier">templIS_IcaES_Ii17user_defined_typeEE</span></code>
585 <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>
586 <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>
591 <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>
592 <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>
599 <br class="table-break"><p>
600 We have not show the "noRTTI & pretty_name" column in the table
601 because it is almost equal to "noRTTI & raw_name" column.
603 <div class="warning"><table border="0" summary="Warning">
605 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
606 <th align="left">Warning</th>
608 <tr><td align="left" valign="top"><p>
609 With RTTI off different classes with same names in anonymous namespace
610 may collapse. See 'RTTI emulation limitations'.
614 <div class="section">
615 <div class="titlepage"><div><div><h3 class="title">
616 <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:
617 Checking namespace at compile time </a>
618 </h3></div></div></div>
620 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>
621 is usable at compile time on a C++14 compatible compilers.
624 In this example we'll create and use a constexpr function that checks namespace
625 of the provided type.
627 <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>
629 <span class="comment">// Helper function that returns true if `name` starts with `substr`</span>
630 <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>
631 <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>
634 <span class="comment">// Function that returns true if `T` declared in namespace `ns`</span>
635 <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>
636 <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>
637 <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>
639 <span class="comment">// Some compilers add `class ` or `struct ` before the namespace, so we need to skip those words first</span>
640 <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>
641 <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>
642 <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>
643 <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>
644 <span class="special">}</span>
646 <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>
647 <span class="special">}</span>
650 Now when we have that wonderfull function, we can do static assertions and
651 other compile-time validations:
653 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">my_project</span> <span class="special">{</span>
654 <span class="keyword">struct</span> <span class="identifier">serializer</span> <span class="special">{</span>
655 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
656 <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>
657 <span class="keyword">static_assert</span><span class="special">(</span>
658 <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>
659 <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>
660 <span class="special">);</span>
662 <span class="comment">// Actual implementation of the serialization goes below</span>
663 <span class="comment">// ...</span>
664 <span class="special">}</span>
665 <span class="special">};</span>
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>
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>
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>
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>
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>
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.
697 Consider the situation when we have a function that accepts std::tuple, boost::variant
698 or some other class that uses variadic templates:
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>
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>
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:
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>
719 One of the ways to reduce instantinations count is to force the types to
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>
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>
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>
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="identifier">t</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>
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>
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-2016 Antony Polukhin<p>
757 Distributed under the Boost Software License, Version 1.0. (See accompanying
758 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>)
763 <div class="spirit-nav">
764 <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>