Imported Upstream version 1.72.0
[platform/upstream/boost.git] / libs / geometry / doc / html / geometry / reference / core / tag_cast.html
1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>tag_cast</title>
5 <link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7 <link rel="home" href="../../../index.html" title="Chapter&#160;1.&#160;Geometry">
8 <link rel="up" href="../core.html" title="Core Metafunctions">
9 <link rel="prev" href="tag.html" title="tag">
10 <link rel="next" href="../de9im.html" title="DE-9IM">
11 </head>
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td>
15 <td align="center"><a href="../../../../../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
20 </tr></table>
21 <hr>
22 <div class="spirit-nav">
23 <a accesskey="p" href="tag.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../core.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="../de9im.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
24 </div>
25 <div class="section">
26 <div class="titlepage"><div><div><h4 class="title">
27 <a name="geometry.reference.core.tag_cast"></a><a class="link" href="tag_cast.html" title="tag_cast">tag_cast</a>
28 </h4></div></div></div>
29 <p>
30           <a class="indexterm" name="idm46186985884752"></a>
31 Metafunction defining a type being either the specified tag, or one of
32           the specified basetags if the type inherits from them.
33         </p>
34 <h6>
35 <a name="geometry.reference.core.tag_cast.h0"></a>
36           <span class="phrase"><a name="geometry.reference.core.tag_cast.description"></a></span><a class="link" href="tag_cast.html#geometry.reference.core.tag_cast.description">Description</a>
37         </h6>
38 <p>
39           Tags can inherit each other. A multi_point inherits, for example, both
40           the multi_tag and the pointlike_tag. Often behaviour can be shared between
41           different geometry types. A tag, found by the metafunction tag, can be
42           casted to a more basic tag, and then dispatched by that tag.
43         </p>
44 <h6>
45 <a name="geometry.reference.core.tag_cast.h1"></a>
46           <span class="phrase"><a name="geometry.reference.core.tag_cast.synopsis"></a></span><a class="link" href="tag_cast.html#geometry.reference.core.tag_cast.synopsis">Synopsis</a>
47         </h6>
48 <p>
49 </p>
50 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Tag</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">BaseTag</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">BaseTag2</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">BaseTag3</span><span class="special">,</span>
51          <span class="keyword">typename</span> <span class="identifier">BaseTag4</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">BaseTag5</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">BaseTag6</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">BaseTag7</span><span class="special">&gt;</span>
52 <span class="keyword">struct</span> <span class="identifier">tag_cast</span>
53 <span class="special">{</span>
54   <span class="comment">// ...</span>
55 <span class="special">};</span>
56 </pre>
57 <p>
58         </p>
59 <h6>
60 <a name="geometry.reference.core.tag_cast.h2"></a>
61           <span class="phrase"><a name="geometry.reference.core.tag_cast.template_parameter_s_"></a></span><a class="link" href="tag_cast.html#geometry.reference.core.tag_cast.template_parameter_s_">Template
62           parameter(s)</a>
63         </h6>
64 <div class="informaltable"><table class="table">
65 <colgroup>
66 <col>
67 <col>
68 <col>
69 </colgroup>
70 <thead><tr>
71 <th>
72                   <p>
73                     Parameter
74                   </p>
75                 </th>
76 <th>
77                   <p>
78                     Default
79                   </p>
80                 </th>
81 <th>
82                   <p>
83                     Description
84                   </p>
85                 </th>
86 </tr></thead>
87 <tbody>
88 <tr>
89 <td>
90                   <p>
91                     typename Tag
92                   </p>
93                 </td>
94 <td>
95                 </td>
96 <td>
97                   <p>
98                     The tag to be casted to one of the base tags
99                   </p>
100                 </td>
101 </tr>
102 <tr>
103 <td>
104                   <p>
105                     typename BaseTag
106                   </p>
107                 </td>
108 <td>
109                 </td>
110 <td>
111                   <p>
112                     First base tag
113                   </p>
114                 </td>
115 </tr>
116 <tr>
117 <td>
118                   <p>
119                     typename BaseTag2
120                   </p>
121                 </td>
122 <td>
123                   <p>
124                     void
125                   </p>
126                 </td>
127 <td>
128                   <p>
129                     Optional second base tag
130                   </p>
131                 </td>
132 </tr>
133 <tr>
134 <td>
135                   <p>
136                     typename BaseTag3
137                   </p>
138                 </td>
139 <td>
140                   <p>
141                     void
142                   </p>
143                 </td>
144 <td>
145                   <p>
146                     Optional third base tag
147                   </p>
148                 </td>
149 </tr>
150 <tr>
151 <td>
152                   <p>
153                     typename BaseTag4
154                   </p>
155                 </td>
156 <td>
157                   <p>
158                     void
159                   </p>
160                 </td>
161 <td>
162                   <p>
163                     Optional fourth base tag
164                   </p>
165                 </td>
166 </tr>
167 <tr>
168 <td>
169                   <p>
170                     typename BaseTag5
171                   </p>
172                 </td>
173 <td>
174                   <p>
175                     void
176                   </p>
177                 </td>
178 <td>
179                   <p>
180                     Optional fifth base tag
181                   </p>
182                 </td>
183 </tr>
184 <tr>
185 <td>
186                   <p>
187                     typename BaseTag6
188                   </p>
189                 </td>
190 <td>
191                   <p>
192                     void
193                   </p>
194                 </td>
195 <td>
196                   <p>
197                     Optional sixth base tag
198                   </p>
199                 </td>
200 </tr>
201 <tr>
202 <td>
203                   <p>
204                     typename BaseTag7
205                   </p>
206                 </td>
207 <td>
208                   <p>
209                     void
210                   </p>
211                 </td>
212 <td>
213                   <p>
214                     Optional seventh base tag
215                   </p>
216                 </td>
217 </tr>
218 </tbody>
219 </table></div>
220 <h6>
221 <a name="geometry.reference.core.tag_cast.h3"></a>
222           <span class="phrase"><a name="geometry.reference.core.tag_cast.header"></a></span><a class="link" href="tag_cast.html#geometry.reference.core.tag_cast.header">Header</a>
223         </h6>
224 <p>
225           Either
226         </p>
227 <p>
228           <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">geometry</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
229         </p>
230 <p>
231           Or
232         </p>
233 <p>
234           <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">geometry</span><span class="special">/</span><span class="identifier">core</span><span class="special">/</span><span class="identifier">tag_cast</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
235         </p>
236 <div class="note"><table border="0" summary="Note">
237 <tr>
238 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
239 <th align="left">Note</th>
240 </tr>
241 <tr><td align="left" valign="top"><p>
242             The specified tag list is handled in the specified order: as soon as
243             a tag inheriting the specified tag is found, it is defined as the metafunction
244             typedef <span class="bold"><strong>type</strong></span>.
245           </p></td></tr>
246 </table></div>
247 <div class="note"><table border="0" summary="Note">
248 <tr>
249 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
250 <th align="left">Note</th>
251 </tr>
252 <tr><td align="left" valign="top"><p>
253             If none of the specified possible base tags is a base class of the specified
254             tag, the tag itself is defined as the <span class="bold"><strong>type</strong></span>
255             result of the metafunction.
256           </p></td></tr>
257 </table></div>
258 <h6>
259 <a name="geometry.reference.core.tag_cast.h4"></a>
260           <span class="phrase"><a name="geometry.reference.core.tag_cast.complexity"></a></span><a class="link" href="tag_cast.html#geometry.reference.core.tag_cast.complexity">Complexity</a>
261         </h6>
262 <p>
263           Compile time
264         </p>
265 <h6>
266 <a name="geometry.reference.core.tag_cast.h5"></a>
267           <span class="phrase"><a name="geometry.reference.core.tag_cast.example"></a></span><a class="link" href="tag_cast.html#geometry.reference.core.tag_cast.example">Example</a>
268         </h6>
269 <p>
270           Check if the polygon_tag can be casted to the areal_tag
271         </p>
272 <p>
273 </p>
274 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
275 <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">typeinfo</span><span class="special">&gt;</span>
276
277 <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">geometry</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
278 <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">geometry</span><span class="special">/</span><span class="identifier">geometries</span><span class="special">/</span><span class="identifier">polygon</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
279 <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">geometry</span><span class="special">/</span><span class="identifier">geometries</span><span class="special">/</span><span class="identifier">point_xy</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
280
281 <span class="keyword">namespace</span> <span class="identifier">geo</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">geometry</span><span class="special">;</span>
282 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
283 <span class="special">{</span>
284     <span class="keyword">typedef</span> <span class="identifier">geo</span><span class="special">::</span><span class="identifier">model</span><span class="special">::</span><span class="identifier">d2</span><span class="special">::</span><span class="identifier">point_xy</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">point_type</span><span class="special">;</span>
285     <span class="keyword">typedef</span> <span class="identifier">geo</span><span class="special">::</span><span class="identifier">model</span><span class="special">::</span><span class="identifier">polygon</span><span class="special">&lt;</span><span class="identifier">point_type</span><span class="special">&gt;</span> <span class="identifier">polygon_type</span><span class="special">;</span>
286
287     <span class="keyword">typedef</span> <span class="identifier">geo</span><span class="special">::</span><span class="identifier">tag</span><span class="special">&lt;</span><span class="identifier">polygon_type</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">tag</span><span class="special">;</span>
288     <span class="keyword">typedef</span> <span class="identifier">geo</span><span class="special">::</span><span class="identifier">tag_cast</span><span class="special">&lt;</span><span class="identifier">tag</span><span class="special">,</span> <span class="identifier">geo</span><span class="special">::</span><span class="identifier">linear_tag</span><span class="special">,</span> <span class="identifier">geo</span><span class="special">::</span><span class="identifier">areal_tag</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">base_tag</span><span class="special">;</span>
289
290     <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"tag: "</span> <span class="special">&lt;&lt;</span> <span class="keyword">typeid</span><span class="special">(</span><span class="identifier">tag</span><span class="special">).</span><span class="identifier">name</span><span class="special">()</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span>
291         <span class="special">&lt;&lt;</span> <span class="string">"base tag: "</span> <span class="special">&lt;&lt;</span> <span class="keyword">typeid</span><span class="special">(</span><span class="identifier">base_tag</span><span class="special">).</span><span class="identifier">name</span><span class="special">()</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
292
293     <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
294 <span class="special">}</span>
295 </pre>
296 <p>
297         </p>
298 <p>
299           Output (in MSVC):
300         </p>
301 <pre class="programlisting">tag: struct boost::geometry::polygon_tag
302 base tag: struct boost::geometry::areal_tag
303 </pre>
304 </div>
305 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
306 <td align="left"></td>
307 <td align="right"><div class="copyright-footer">Copyright &#169; 2009-2019 Barend Gehrels, Bruno Lalande, Mateusz Loskot, Adam
308       Wulkiewicz, Oracle and/or its affiliates<p>
309         Distributed under the Boost Software License, Version 1.0. (See accompanying
310         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>)
311       </p>
312 </div></td>
313 </tr></table>
314 <hr>
315 <div class="spirit-nav">
316 <a accesskey="p" href="tag.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../core.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="../de9im.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
317 </div>
318 </body>
319 </html>