• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<head>
4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5<title>Function apply_visitor</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="../variant/reference.html#header.boost.variant.apply_visitor_hpp" title="Header &lt;boost/variant/apply_visitor.hpp&gt;">
10<link rel="prev" href="apply_visit_1_3_46_5_7_1_2.html" title="Class template apply_visitor_delayed_cpp14_t">
11<link rel="next" href="../BOOST_VARAINT_1_3_46_5_8_3.html" title="Macro BOOST_VARAINT_MAX_MULTIVIZITOR_PARAMS">
12</head>
13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
14<table cellpadding="2" width="100%"><tr>
15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
16<td align="center"><a href="../../../index.html">Home</a></td>
17<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
20<td align="center"><a href="../../../more/index.htm">More</a></td>
21</tr></table>
22<hr>
23<div class="spirit-nav">
24<a accesskey="p" href="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>
25</div>
26<div class="refentry">
27<a name="boost.apply_visitor"></a><div class="titlepage"></div>
28<div class="refnamediv">
29<h2><span class="refentrytitle">Function apply_visitor</span></h2>
30<p>boost::apply_visitor — Allows compile-time checked type-safe application of the
31        given visitor to the content of the given variant, ensuring that all
32        types are handled by the visitor.</p>
33</div>
34<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
35<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;
36
37</span>
38<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>
39  <span class="keyword">typename</span> <span class="identifier">Visitor</span><span class="special">::</span><span class="identifier">result_type</span>
40  <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>
41<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>
42  <span class="keyword">typename</span> <span class="identifier">Visitor</span><span class="special">::</span><span class="identifier">result_type</span>
43  <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>
44<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>
45  <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>
46  <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>
47                <span class="identifier">Variant2</span><span class="special">&amp;&amp;</span> operand2<span class="special">)</span><span class="special">;</span>
48<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>
49  <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>
50  <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>
51                <span class="identifier">Variant2</span><span class="special">&amp;&amp;</span> operand2<span class="special">)</span><span class="special">;</span>
52<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>
53         <span class="keyword">typename</span> Variant3<span class="special">&gt;</span>
54  <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>
55  <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>
56                <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>
57<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>
58         <span class="keyword">typename</span> Variant3<span class="special">&gt;</span>
59  <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>
60  <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>
61                <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>
62<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> Visitor<span class="special">&gt;</span>
63  <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>
64<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> Visitor<span class="special">&gt;</span>
65  <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>
66<div class="refsect1">
67<a name="id-1.3.46.5.8.5.4"></a><h2>Description</h2>
68<p>The behavior of <code class="computeroutput">apply_visitor</code> is dependent on
69        the number of arguments on which it operates (i.e., other than the
70        visitor). If your compiler does not support the rvalue references or reference qualifiers then all the
71        forwarding references from above degrade to non const lvalue reference. The function behaves as follows:
72
73          <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
74<li class="listitem">Overloads accepting one operand invoke the unary function
75              call operator of the given visitor on the content of the given
76              <code class="computeroutput"><a class="link" href="variant.html" title="Class template variant">variant</a></code> operand.</li>
77<li class="listitem">Overloads accepting two operands invoke the binary
78              function call operator of the given visitor on the content of
79              the given <code class="computeroutput"><a class="link" href="variant.html" title="Class template variant">variant</a></code>
80              operands.</li>
81<li class="listitem">Overloads accepting three or more operands invoke the
82              function call operator of the given visitor on the content of
83              the given <code class="computeroutput"><a class="link" href="variant.html" title="Class template variant">variant</a></code>
84              operands. Maximum amount of parameters controlled by
85              <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>
86              macro. Those functions are actually defined in a header <code class="computeroutput">boost/variant/multivisitors.hpp</code>
87              (See <a class="xref" href="../variant/reference.html#header.boost.variant.multivisitors_hpp" title="Header &lt;boost/variant/multivisitors.hpp&gt;">the section called “Header &lt;boost/variant/multivisitors.hpp&gt;”</a>). That header must be manually included
88              if multi visitors are meant for use.</li>
89<li class="listitem">The overloads accepting only a visitor return a
90              <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>
91              or
92                <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>
93              that accepts either one, two or arbitrary count of arguments and invoke
94              <code class="computeroutput"><a class="link" href="apply_visitor.html" title="Function apply_visitor">apply_visitor</a></code> using
95              these arguments and <code class="computeroutput">visitor</code>, thus behaving as
96              specified above. (This behavior is particularly useful, for
97              example, when one needs to operate on each element of a sequence
98              of variant objects using a standard library
99              algorithm.)</li>
100</ul></div>
101
102        </p>
103<div class="variablelist"><table border="0" class="variablelist compact">
104<colgroup>
105<col align="left" valign="top">
106<col>
107</colgroup>
108<tbody>
109<tr>
110<td><p><span class="term">Returns:</span></p></td>
111<td>The overloads acccepting operands return the result of
112        applying the given visitor to the content of the given operands.
113        The overload accepting only a visitor return a function object, thus
114        delaying application of the visitor to any operands.</td>
115</tr>
116<tr>
117<td><p><span class="term">Requires:</span></p></td>
118<td>The given visitor must fulfill the
119        <a class="link" href="../variant/reference.html#variant.concepts.static-visitor" title="StaticVisitor"><span class="emphasis"><em>StaticVisitor</em></span></a>
120        concept requirements with respect to each of the bounded types of the
121        given <code class="computeroutput">variant</code>.</td>
122</tr>
123<tr>
124<td><p><span class="term">Throws:</span></p></td>
125<td>The overloads accepting operands throw only if the given
126        visitor throws when applied. The overload accepting only a visitor
127        will not throw. (Note, however, that the returned
128        <a class="link" href="apply_visitor_delayed_t.html" title="Class template apply_visitor_delayed_t">function object</a>
129        may throw when invoked.)</td>
130</tr>
131</tbody>
132</table></div>
133</div>
134</div>
135<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
136<td align="left"></td>
137<td align="right"><div class="copyright-footer">Copyright © 2002, 2003 Eric Friedman, Itay Maman<br>Copyright © 2014-2020 Antony Polukhin<p>Distributed under the Boost Software License, Version 1.0.
138    (See accompanying file <code class="filename">LICENSE_1_0.txt</code> or copy at
139    <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
140    </p>
141</div></td>
142</tr></table>
143<hr>
144<div class="spirit-nav">
145<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>
146</div>
147</body>
148</html>
149