summaryrefslogtreecommitdiff
path: root/doc/html/boost/apply_visitor.html
blob: 6b307f657946d1ce19a3b84616efbc618b41e44c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Function apply_visitor</title>
<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../variant/reference.html#header.boost.variant.apply_visitor_hpp" title="Header &lt;boost/variant/apply_visitor.hpp&gt;">
<link rel="prev" href="apply_visit_1_3_46_5_7_1_2.html" title="Class template apply_visitor_delayed_cpp14_t">
<link rel="next" href="../BOOST_VARAINT_1_3_46_5_8_3.html" title="Macro BOOST_VARAINT_MAX_MULTIVIZITOR_PARAMS">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
<td align="center"><a href="../../../index.html">Home</a></td>
<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="apply_visit_1_3_46_5_7_1_2.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../variant/reference.html#header.boost.variant.apply_visitor_hpp"><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_VARAINT_1_3_46_5_8_3.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="refentry">
<a name="boost.apply_visitor"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2><span class="refentrytitle">Function apply_visitor</span></h2>
<p>boost::apply_visitor &#8212; Allows compile-time checked type-safe application of the
        given visitor to the content of the given variant, ensuring that all
        types are handled by the visitor.</p>
</div>
<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: &lt;<a class="link" href="../variant/reference.html#header.boost.variant.apply_visitor_hpp" title="Header &lt;boost/variant/apply_visitor.hpp&gt;">boost/variant/apply_visitor.hpp</a>&gt;

</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> Visitor<span class="special">,</span> <span class="keyword">typename</span> Variant<span class="special">&gt;</span> 
  <span class="keyword">typename</span> <span class="identifier">Visitor</span><span class="special">::</span><span class="identifier">result_type</span> 
  <span class="identifier">apply_visitor</span><span class="special">(</span><span class="identifier">Visitor</span> <span class="special">&amp;</span> visitor<span class="special">,</span> <span class="identifier">Variant</span><span class="special">&amp;&amp;</span> operand<span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> Visitor<span class="special">,</span> <span class="keyword">typename</span> Variant<span class="special">&gt;</span> 
  <span class="keyword">typename</span> <span class="identifier">Visitor</span><span class="special">::</span><span class="identifier">result_type</span> 
  <span class="identifier">apply_visitor</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Visitor</span> <span class="special">&amp;</span> visitor<span class="special">,</span> <span class="identifier">Variant</span><span class="special">&amp;&amp;</span> operand<span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> BinaryVisitor<span class="special">,</span> <span class="keyword">typename</span> Variant1<span class="special">,</span> <span class="keyword">typename</span> Variant2<span class="special">&gt;</span> 
  <span class="keyword">typename</span> <span class="identifier">BinaryVisitor</span><span class="special">::</span><span class="identifier">result_type</span> <span class="identifier">OR</span> <span class="keyword">decltype</span><span class="special">(</span><span class="keyword">auto</span><span class="special">)</span> 
  <span class="identifier">apply_visitor</span><span class="special">(</span><span class="identifier">BinaryVisitor</span> <span class="special">&amp;</span> visitor<span class="special">,</span> <span class="identifier">Variant1</span><span class="special">&amp;&amp;</span> operand1<span class="special">,</span> 
                <span class="identifier">Variant2</span><span class="special">&amp;&amp;</span> operand2<span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> BinaryVisitor<span class="special">,</span> <span class="keyword">typename</span> Variant1<span class="special">,</span> <span class="keyword">typename</span> Variant2<span class="special">&gt;</span> 
  <span class="keyword">typename</span> <span class="identifier">BinaryVisitor</span><span class="special">::</span><span class="identifier">result_type</span> <span class="identifier">OR</span> <span class="keyword">decltype</span><span class="special">(</span><span class="keyword">auto</span><span class="special">)</span> 
  <span class="identifier">apply_visitor</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">BinaryVisitor</span> <span class="special">&amp;</span> visitor<span class="special">,</span> <span class="identifier">Variant1</span><span class="special">&amp;&amp;</span> operand1<span class="special">,</span> 
                <span class="identifier">Variant2</span><span class="special">&amp;&amp;</span> operand2<span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> MultiVisitor<span class="special">,</span> <span class="keyword">typename</span> Variant1<span class="special">,</span> <span class="keyword">typename</span> Variant2<span class="special">,</span> 
         <span class="keyword">typename</span> Variant3<span class="special">&gt;</span> 
  <span class="keyword">typename</span> <span class="identifier">MultiVisitor</span><span class="special">::</span><span class="identifier">result_type</span> <span class="identifier">OR</span> <span class="keyword">decltype</span><span class="special">(</span><span class="keyword">auto</span><span class="special">)</span> 
  <span class="identifier">apply_visitor</span><span class="special">(</span><span class="identifier">MultiVisitor</span> <span class="special">&amp;</span> visitor<span class="special">,</span> <span class="identifier">Variant1</span><span class="special">&amp;&amp;</span> operand1<span class="special">,</span> 
                <span class="identifier">Variant2</span><span class="special">&amp;&amp;</span> operand2<span class="special">,</span> <span class="identifier">Variant3</span><span class="special">&amp;&amp;</span> operand3<span class="special">,</span> <span class="special">...</span> other_operands<span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> MultiVisitor<span class="special">,</span> <span class="keyword">typename</span> Variant1<span class="special">,</span> <span class="keyword">typename</span> Variant2<span class="special">,</span> 
         <span class="keyword">typename</span> Variant3<span class="special">&gt;</span> 
  <span class="keyword">typename</span> <span class="identifier">MultiVisitor</span><span class="special">::</span><span class="identifier">result_type</span> <span class="identifier">OR</span> <span class="keyword">decltype</span><span class="special">(</span><span class="keyword">auto</span><span class="special">)</span> 
  <span class="identifier">apply_visitor</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MultiVisitor</span> <span class="special">&amp;</span> visitor<span class="special">,</span> <span class="identifier">Variant1</span><span class="special">&amp;&amp;</span> operand1<span class="special">,</span> 
                <span class="identifier">Variant2</span><span class="special">&amp;&amp;</span> operand2<span class="special">,</span> <span class="identifier">Variant3</span><span class="special">&amp;&amp;</span> operand3<span class="special">,</span> <span class="special">...</span> other_operands<span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> Visitor<span class="special">&gt;</span> 
  <a class="link" href="apply_visitor_delayed_t.html" title="Class template apply_visitor_delayed_t">apply_visitor_delayed_t</a><span class="special">&lt;</span><span class="identifier">Visitor</span><span class="special">&gt;</span> <span class="identifier">apply_visitor</span><span class="special">(</span><span class="identifier">Visitor</span> <span class="special">&amp;</span> visitor<span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> Visitor<span class="special">&gt;</span> 
  <a class="link" href="apply_visit_1_3_46_5_7_1_2.html" title="Class template apply_visitor_delayed_cpp14_t">apply_visitor_delayed_cpp14_t</a><span class="special">&lt;</span><span class="identifier">Visitor</span><span class="special">&gt;</span> <span class="identifier">apply_visitor</span><span class="special">(</span><span class="identifier">Visitor</span> <span class="special">&amp;</span> visitor<span class="special">)</span><span class="special">;</span></pre></div>
<div class="refsect1">
<a name="id-1.3.46.5.8.5.4"></a><h2>Description</h2>
<p>The behavior of <code class="computeroutput">apply_visitor</code> is dependent on
        the number of arguments on which it operates (i.e., other than the
        visitor). If your compiler does not support the rvalue references or reference qualifiers then all the 
        forwarding references from above degrade to non const lvalue reference. The function behaves as follows:

          <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">Overloads accepting one operand invoke the unary function
              call operator of the given visitor on the content of the given
              <code class="computeroutput"><a class="link" href="variant.html" title="Class template variant">variant</a></code> operand.</li>
<li class="listitem">Overloads accepting two operands invoke the binary
              function call operator of the given visitor on the content of
              the given <code class="computeroutput"><a class="link" href="variant.html" title="Class template variant">variant</a></code>
              operands.</li>
<li class="listitem">Overloads accepting three or more operands invoke the
              function call operator of the given visitor on the content of
              the given <code class="computeroutput"><a class="link" href="variant.html" title="Class template variant">variant</a></code>
              operands. Maximum amount of parameters controlled by
              <code class="computeroutput"><span class="bold"><strong><a class="link" href="../BOOST_VARAINT_1_3_46_5_8_3.html" title="Macro BOOST_VARAINT_MAX_MULTIVIZITOR_PARAMS">BOOST_VARAINT_MAX_MULTIVIZITOR_PARAMS</a></strong></span></code>
              macro. Those functions are actually defined in a header <code class="computeroutput">boost/variant/multivisitors.hpp</code>
              (See <a class="xref" href="../variant/reference.html#header.boost.variant.multivisitors_hpp" title="Header &lt;boost/variant/multivisitors.hpp&gt;">the section called &#8220;Header &lt;boost/variant/multivisitors.hpp&gt;&#8221;</a>). That header must be manually included
              if multi visitors are meant for use.</li>
<li class="listitem">The overloads accepting only a visitor return a
              <code class="computeroutput"><a class="link" href="apply_visitor_delayed_t.html" title="Class template apply_visitor_delayed_t">C++03 compatible generic function object</a></code>
              or
                <code class="computeroutput"><a class="link" href="apply_visit_1_3_46_5_7_1_2.html" title="Class template apply_visitor_delayed_cpp14_t">C++14 compatible generic function object</a></code>
              that accepts either one, two or arbitrary count of arguments and invoke
              <code class="computeroutput"><a class="link" href="apply_visitor.html" title="Function apply_visitor">apply_visitor</a></code> using
              these arguments and <code class="computeroutput">visitor</code>, thus behaving as
              specified above. (This behavior is particularly useful, for
              example, when one needs to operate on each element of a sequence
              of variant objects using a standard library
              algorithm.)</li>
</ul></div>

        </p>
<div class="variablelist"><table border="0" class="variablelist compact">
<colgroup>
<col align="left" valign="top">
<col>
</colgroup>
<tbody>
<tr>
<td><p><span class="term">Returns:</span></p></td>
<td>The overloads acccepting operands return the result of
        applying the given visitor to the content of the given operands.
        The overload accepting only a visitor return a function object, thus
        delaying application of the visitor to any operands.</td>
</tr>
<tr>
<td><p><span class="term">Requires:</span></p></td>
<td>The given visitor must fulfill the
        <a class="link" href="../variant/reference.html#variant.concepts.static-visitor" title="StaticVisitor"><span class="emphasis"><em>StaticVisitor</em></span></a>
        concept requirements with respect to each of the bounded types of the
        given <code class="computeroutput">variant</code>.</td>
</tr>
<tr>
<td><p><span class="term">Throws:</span></p></td>
<td>The overloads accepting operands throw only if the given
        visitor throws when applied. The overload accepting only a visitor
        will not throw. (Note, however, that the returned
        <a class="link" href="apply_visitor_delayed_t.html" title="Class template apply_visitor_delayed_t">function object</a>
        may throw when invoked.)</td>
</tr>
</tbody>
</table></div>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2002, 2003 Eric Friedman, Itay Maman<p>Distributed under the Boost Software License, Version 1.0.
    (See accompanying file <code class="filename">LICENSE_1_0.txt</code> or copy at 
    <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
    </p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="apply_visit_1_3_46_5_7_1_2.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../variant/reference.html#header.boost.variant.apply_visitor_hpp"><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_VARAINT_1_3_46_5_8_3.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>