1 <?xml version=
"1.0" encoding=
"utf-8"?>
2 <!DOCTYPE header PUBLIC
"-//Boost//DTD BoostBook XML V1.0//EN"
3 "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
5 Copyright 2003, Eric Friedman, Itay Maman.
7 Distributed under the Boost Software License, Version 1.0. (See accompanying
8 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
10 <header name=
"boost/variant/get.hpp">
11 <namespace name=
"boost">
13 <class name=
"bad_get">
14 <inherit access=
"public">
15 <classname>std::exception
</classname>
19 <simpara>The exception thrown in the event of a failed application of
20 <code><functionname>boost::get
</functionname></code> on the given
21 operand value.
</simpara>
24 <method name=
"what" specifiers=
"virtual" cv=
"const">
25 <type>const char *
</type>
29 <overloaded-function name=
"relaxed_get">
32 <template-type-parameter name=
"U"/>
33 <template-type-parameter name=
"T1"/>
34 <template-type-parameter name=
"T2"/>
36 <template-type-parameter name=
"TN"/>
41 <parameter name=
"operand">
42 <paramtype><classname>variant
</classname><T1, T2, ..., TN
> *
</paramtype>
48 <template-type-parameter name=
"U"/>
49 <template-type-parameter name=
"T1"/>
50 <template-type-parameter name=
"T2"/>
52 <template-type-parameter name=
"TN"/>
55 <type>const U *
</type>
57 <parameter name=
"operand">
58 <paramtype>const
<classname>variant
</classname><T1, T2, ..., TN
> *
</paramtype>
64 <template-type-parameter name=
"U"/>
65 <template-type-parameter name=
"T1"/>
66 <template-type-parameter name=
"T2"/>
68 <template-type-parameter name=
"TN"/>
73 <parameter name=
"operand">
74 <paramtype><classname>variant
</classname><T1, T2, ..., TN
> &</paramtype>
80 <template-type-parameter name=
"U"/>
81 <template-type-parameter name=
"T1"/>
82 <template-type-parameter name=
"T2"/>
84 <template-type-parameter name=
"TN"/>
87 <type>const U
&</type>
89 <parameter name=
"operand">
90 <paramtype>const
<classname>variant
</classname><T1, T2, ..., TN
> &</paramtype>
95 <simpara>Retrieves a value of a specified type from a given
96 <code><classname>variant
</classname></code>.
</simpara>
97 <simpara>Unlike
<functionname>strict_get
</functionname> does not assert at compile time
98 that type
<code>U
</code> is one of the types that can be stored in variant.
</simpara>
102 <simpara>The
<code>get
</code> function allows run-time checked,
103 type-safe retrieval of the content of the given
104 <code><classname>variant
</classname></code>. The function succeeds
105 only if the content is of the specified type
<code>U
</code>, with
106 failure indicated as described below.
</simpara>
107 <simpara><emphasis role=
"bold">Recomendation
</emphasis>: Use
108 <functionname>get
</functionname> or
<functionname>strict_get
</functionname> in new code.
109 <functionname>strict_get
</functionname>
110 provides more compile time checks and its behavior is closer to
<code>std::get
</code>
111 from C++ Standard Library.
</simpara>
112 <simpara><emphasis role=
"bold">Warning
</emphasis>: After either
113 <code>operand
</code> or its content is destroyed (e.g., when the
114 given
<code><classname>variant
</classname></code> is assigned a
115 value of different type), the returned reference is invalidated.
116 Thus, significant care and caution must be extended when handling
117 the returned reference.
</simpara>
121 <simpara>As part of its guarantee of type-safety,
<code>get
</code>
122 enforces
<code>const
</code>-correctness. Thus, the specified type
123 <code>U
</code> must be
<code>const
</code>-qualified whenever
124 <code>operand
</code> or its content is likewise
125 <code>const
</code>-qualified. The converse, however, is not required:
126 that is, the specified type
<code>U
</code> may be
127 <code>const
</code>-qualified even when
<code>operand
</code> and its
128 content are not.
</simpara>
132 <simpara>If passed a pointer,
<code>get
</code> returns a pointer to
133 the value content if it is of the specified type
<code>U
</code>;
134 otherwise, a null pointer is returned. If passed a reference,
135 <code>get
</code> returns a reference to the value content if it is of
136 the specified type
<code>U
</code>; otherwise, an exception is thrown
137 (see below).
</simpara>
141 <simpara>Overloads taking a
142 <code><classname>variant
</classname></code> pointer will not
143 throw; the overloads taking a
144 <code><classname>variant
</classname></code> reference throw
145 <code><classname>bad_get
</classname></code> if the content is not of
146 the specified type
<code>U
</code>.
</simpara>
150 <simpara>While visitation via
151 <code><functionname>apply_visitor
</functionname></code>
152 is generally preferred due to its greater safety,
<code>get
</code> may
153 may be more convenient in some cases due to its straightforward
156 </overloaded-function>
158 <overloaded-function name=
"strict_get">
161 <template-type-parameter name=
"U"/>
162 <template-type-parameter name=
"T1"/>
163 <template-type-parameter name=
"T2"/>
165 <template-type-parameter name=
"TN"/>
170 <parameter name=
"operand">
171 <paramtype><classname>variant
</classname><T1, T2, ..., TN
> *
</paramtype>
177 <template-type-parameter name=
"U"/>
178 <template-type-parameter name=
"T1"/>
179 <template-type-parameter name=
"T2"/>
181 <template-type-parameter name=
"TN"/>
184 <type>const U *
</type>
186 <parameter name=
"operand">
187 <paramtype>const
<classname>variant
</classname><T1, T2, ..., TN
> *
</paramtype>
193 <template-type-parameter name=
"U"/>
194 <template-type-parameter name=
"T1"/>
195 <template-type-parameter name=
"T2"/>
197 <template-type-parameter name=
"TN"/>
202 <parameter name=
"operand">
203 <paramtype><classname>variant
</classname><T1, T2, ..., TN
> &</paramtype>
209 <template-type-parameter name=
"U"/>
210 <template-type-parameter name=
"T1"/>
211 <template-type-parameter name=
"T2"/>
213 <template-type-parameter name=
"TN"/>
216 <type>const U
&</type>
218 <parameter name=
"operand">
219 <paramtype>const
<classname>variant
</classname><T1, T2, ..., TN
> &</paramtype>
224 <simpara>Retrieves a value of a specified type from a given
225 <code><classname>variant
</classname></code>.
</simpara>
229 <simpara>Acts exactly like
<functionname>relaxed_get
</functionname> but does a compile time check
230 that type
<code>U
</code> is one of the types that can be stored in variant.
</simpara>
232 </overloaded-function>
234 <overloaded-function name=
"get">
237 <template-type-parameter name=
"U"/>
238 <template-type-parameter name=
"T1"/>
239 <template-type-parameter name=
"T2"/>
241 <template-type-parameter name=
"TN"/>
246 <parameter name=
"operand">
247 <paramtype><classname>variant
</classname><T1, T2, ..., TN
> *
</paramtype>
253 <template-type-parameter name=
"U"/>
254 <template-type-parameter name=
"T1"/>
255 <template-type-parameter name=
"T2"/>
257 <template-type-parameter name=
"TN"/>
260 <type>const U *
</type>
262 <parameter name=
"operand">
263 <paramtype>const
<classname>variant
</classname><T1, T2, ..., TN
> *
</paramtype>
269 <template-type-parameter name=
"U"/>
270 <template-type-parameter name=
"T1"/>
271 <template-type-parameter name=
"T2"/>
273 <template-type-parameter name=
"TN"/>
278 <parameter name=
"operand">
279 <paramtype><classname>variant
</classname><T1, T2, ..., TN
> &</paramtype>
285 <template-type-parameter name=
"U"/>
286 <template-type-parameter name=
"T1"/>
287 <template-type-parameter name=
"T2"/>
289 <template-type-parameter name=
"TN"/>
292 <type>const U
&</type>
294 <parameter name=
"operand">
295 <paramtype>const
<classname>variant
</classname><T1, T2, ..., TN
> &</paramtype>
300 <simpara>Retrieves a value of a specified type from a given
301 <code><classname>variant
</classname></code>.
</simpara>
305 <simpara>Evaluates to
<functionname>strict_get
</functionname> if
<code>BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
</code>
306 is not defined. If
<code>BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
</code>
307 is defined then evaluates to
<functionname>relaxed_get
</functionname>.
</simpara>
309 <simpara><emphasis role=
"bold">Recomendation
</emphasis>: Use
310 <functionname>get
</functionname> in new code without defining
311 <code>BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
</code>. In that way
<functionname>get
</functionname>
312 provides more compile time checks and its behavior is closer to
<code>std::get
</code>
313 from C++ Standard Library.
</simpara>
315 </overloaded-function>