summaryrefslogtreecommitdiff
path: root/doc/html/signals/tutorial.html
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2019-12-05 15:21:30 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2019-12-05 15:21:30 +0900
commitd6a306e745acfee00e81ccaf3324a2a03516db41 (patch)
tree145a26368608982f40ebb0f4836185c44abb9ae4 /doc/html/signals/tutorial.html
parent5ce2ccf2f23c6d3de4c79f216f57ca6f2a18ed16 (diff)
downloadboost-d6a306e745acfee00e81ccaf3324a2a03516db41.tar.gz
boost-d6a306e745acfee00e81ccaf3324a2a03516db41.tar.bz2
boost-d6a306e745acfee00e81ccaf3324a2a03516db41.zip
Imported Upstream version 1.69.0upstream/1.69.0
Diffstat (limited to 'doc/html/signals/tutorial.html')
-rw-r--r--doc/html/signals/tutorial.html1152
1 files changed, 0 insertions, 1152 deletions
diff --git a/doc/html/signals/tutorial.html b/doc/html/signals/tutorial.html
deleted file mode 100644
index c4b31d3ffc..0000000000
--- a/doc/html/signals/tutorial.html
+++ /dev/null
@@ -1,1152 +0,0 @@
-<!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>Tutorial</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="../signals.html" title="Chapter&#160;35.&#160;Boost.Signals">
-<link rel="prev" href="../signals.html" title="Chapter&#160;35.&#160;Boost.Signals">
-<link rel="next" href="reference.html" title="Reference">
-</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="../signals.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../signals.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="reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="signals.tutorial"></a>Tutorial</h2></div></div></div>
-<div class="toc"><dl class="toc">
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.2">How to Read this Tutorial</a></span></dt>
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.3">Compatibility Note</a></span></dt>
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.4">Hello, World! (Beginner)</a></span></dt>
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.5">Calling multiple slots</a></span></dt>
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.6">Passing values to and from slots</a></span></dt>
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.7">Connection Management</a></span></dt>
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.8">Example: Document-View</a></span></dt>
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.9">Linking against the Signals library</a></span></dt>
-</dl></div>
-<div class="section">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="id-1.3.36.4.2"></a>How to Read this Tutorial</h3></div></div></div>
-<p>This tutorial is not meant to be read linearly. Its top-level
-structure roughly separates different concepts in the library
-(e.g., handling calling multiple slots, passing values to and from
-slots) and in each of these concepts the basic ideas are presented
-first and then more complex uses of the library are described
-later. Each of the sections is marked <span class="emphasis"><em>Beginner</em></span>,
-<span class="emphasis"><em>Intermediate</em></span>, or <span class="emphasis"><em>Advanced</em></span> to help guide the
-reader. The <span class="emphasis"><em>Beginner</em></span> sections include information that all
-library users should know; one can make good use of the Signals
-library after having read only the <span class="emphasis"><em>Beginner</em></span> sections. The
-<span class="emphasis"><em>Intermediate</em></span> sections build on the <span class="emphasis"><em>Beginner</em></span>
-sections with slightly more complex uses of the library. Finally,
-the <span class="emphasis"><em>Advanced</em></span> sections detail very advanced uses of the
-Signals library, that often require a solid working knowledge of
-the <span class="emphasis"><em>Beginner</em></span> and <span class="emphasis"><em>Intermediate</em></span> topics; most users
-will not need to read the <span class="emphasis"><em>Advanced</em></span> sections.</p>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="id-1.3.36.4.3"></a>Compatibility Note</h3></div></div></div>
-<p>Boost.Signals has two syntactical forms: the preferred form and
-the compatibility form. The preferred form fits more closely with the
-C++ language and reduces the number of separate template parameters
-that need to be considered, often improving readability; however, the
-preferred form is not supported on all platforms due to compiler
-bugs. The compatible form will work on all compilers supported by
-Boost.Signals. Consult the table below to determine which syntactic
-form to use for your compiler. Users of Boost.Function, please note
-that the preferred syntactic form in Signals is equivalent to that of
-Function's preferred syntactic form.</p>
-<p>If your compiler does not appear in this list, please try the
-preferred syntax and report your results to the Boost list so that
-we can keep this table up-to-date.</p>
-<div class="informaltable"><table class="table">
-<colgroup>
-<col>
-<col>
-</colgroup>
-<thead><tr>
-<th align="left">Preferred syntax</th>
-<th align="left">Portable syntax</th>
-</tr></thead>
-<tbody><tr>
-<td align="left">
- <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<li class="listitem"><p>GNU C++ 2.95.x, 3.0.x, 3.1.x</p></li>
-<li class="listitem"><p>Comeau C++ 4.2.45.2</p></li>
-<li class="listitem"><p>SGI MIPSpro 7.3.0</p></li>
-<li class="listitem"><p>Intel C++ 5.0, 6.0</p></li>
-<li class="listitem"><p>Compaq's cxx 6.2</p></li>
-<li class="listitem"><p>Microsoft Visual C++ 7.1</p></li>
-</ul></div>
- </td>
-<td align="left">
- <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<li class="listitem"><p><span class="emphasis"><em>Any compiler supporting the preferred syntax</em></span></p></li>
-<li class="listitem"><p>Microsoft Visual C++ 6.0, 7.0</p></li>
-<li class="listitem"><p>Borland C++ 5.5.1</p></li>
-<li class="listitem"><p>Sun WorkShop 6 update 2 C++ 5.3</p></li>
-<li class="listitem"><p>Metrowerks CodeWarrior 8.1</p></li>
-</ul></div>
- </td>
-</tr></tbody>
-</table></div>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="id-1.3.36.4.4"></a>Hello, World! (Beginner)</h3></div></div></div>
-<p>The following example writes "Hello, World!" using signals and
-slots. First, we create a signal <code class="computeroutput">sig</code>, a signal that
-takes no arguments and has a void return value. Next, we connect
-the <code class="computeroutput">hello</code> function object to the signal using the
-<code class="computeroutput">connect</code> method. Finally, use the signal
-<code class="computeroutput">sig</code> like a function to call the slots, which in turns
-invokes <code class="computeroutput">HelloWorld::operator()</code> to print "Hello,
-World!".</p>
-<div class="informaltable"><table class="table">
-<colgroup>
-<col>
-<col>
-</colgroup>
-<thead><tr>
-<th align="left">Preferred syntax</th>
-<th align="left">Portable syntax</th>
-</tr></thead>
-<tbody><tr>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-struct HelloWorld
-{
- void operator()() const
- {
- std::cout &lt;&lt; "Hello, World!" &lt;&lt; std::endl;
- }
-};
-
-// ...
-
-// Signal with no arguments and a void return value
-<code class="computeroutput"><a class="link" href="../boost/signal.html" title="Class template signal">boost::signal</a></code>&lt;void ()&gt; sig;
-
-// Connect a HelloWorld slot
-HelloWorld hello;
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(hello);
-
-// Call all of the slots
-sig();
-</pre>
-</td>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-struct HelloWorld
-{
- void operator()() const
- {
- std::cout &lt;&lt; "Hello, World!" &lt;&lt; std::endl;
- }
-};
-
-// ...
-
-// Signal with no arguments and a void return value
-<code class="computeroutput"><a class="link" href="../boost/signalN.html" title="Class template signalN">boost::signal0</a></code>&lt;void&gt; sig;
-
-// Connect a HelloWorld slot
-HelloWorld hello;
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(hello);
-
-// Call all of the slots
-sig();
-</pre>
-</td>
-</tr></tbody>
-</table></div>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="id-1.3.36.4.5"></a>Calling multiple slots</h3></div></div></div>
-<div class="toc"><dl class="toc">
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.5.2">Connecting multiple slots (Beginner)</a></span></dt>
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.5.3">Ordering slot call groups (Intermediate)</a></span></dt>
-</dl></div>
-<div class="section">
-<div class="titlepage"><div><div><h4 class="title">
-<a name="id-1.3.36.4.5.2"></a>Connecting multiple slots (Beginner)</h4></div></div></div>
-<p>Calling a single slot from a signal isn't very interesting, so
-we can make the Hello, World program more interesting by splitting
-the work of printing "Hello, World!" into two completely separate
-slots. The first slot will print "Hello" and may look like
-this:</p>
-<pre class="programlisting">
-struct Hello
-{
- void operator()() const
- {
- std::cout &lt;&lt; "Hello";
- }
-};
-</pre>
-<p>The second slot will print ", World!" and a newline, to complete
-the program. The second slot may look like this:</p>
-<pre class="programlisting">
-struct World
-{
- void operator()() const
- {
- std::cout &lt;&lt; ", World!" &lt;&lt; std::endl;
- }
-};
-</pre>
-<p>Like in our previous example, we can create a signal
-<code class="computeroutput">sig</code> that takes no arguments and has a
-<code class="computeroutput">void</code> return value. This time, we connect both a
-<code class="computeroutput">hello</code> and a <code class="computeroutput">world</code> slot to the same
-signal, and when we call the signal both slots will be called.</p>
-<div class="informaltable"><table class="table">
-<colgroup>
-<col>
-<col>
-</colgroup>
-<thead><tr>
-<th align="left">Preferred syntax</th>
-<th align="left">Portable syntax</th>
-</tr></thead>
-<tbody><tr>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-<code class="computeroutput"><a class="link" href="../boost/signal.html" title="Class template signal">boost::signal</a></code>&lt;void ()&gt; sig;
-
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(Hello());
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(World());
-
-sig();
-</pre>
-</td>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-<code class="computeroutput"><a class="link" href="../boost/signalN.html" title="Class template signalN">boost::signal0</a></code>&lt;void&gt; sig;
-
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(Hello());
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(World());
-
-sig();
-</pre>
-</td>
-</tr></tbody>
-</table></div>
-<p>By default, slots are called in first-in first-out (FIFO) order,
-so the output of this program will be as expected:</p>
-<pre class="programlisting">
-Hello, World!
-</pre>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h4 class="title">
-<a name="id-1.3.36.4.5.3"></a>Ordering slot call groups (Intermediate)</h4></div></div></div>
-<p>Slots are free to have side effects, and that can mean that some
-slots will have to be called before others even if they are not connected in that order. The Boost.Signals
-library allows slots to be placed into groups that are ordered in
-some way. For our Hello, World program, we want "Hello" to be
-printed before ", World!", so we put "Hello" into a group that must
-be executed before the group that ", World!" is in. To do this, we
-can supply an extra parameter at the beginning of the
-<code class="computeroutput">connect</code> call that specifies the group. Group values
-are, by default, <code class="computeroutput">int</code>s, and are ordered by the integer
-&lt; relation. Here's how we construct Hello, World:</p>
-<div class="informaltable"><table class="table">
-<colgroup>
-<col>
-<col>
-</colgroup>
-<thead><tr>
-<th align="left">Preferred syntax</th>
-<th align="left">Portable syntax</th>
-</tr></thead>
-<tbody><tr>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-<code class="computeroutput"><a class="link" href="../boost/signal.html" title="Class template signal">boost::signal</a></code>&lt;void ()&gt; sig;
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(1, World());
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(0, Hello());
-sig();
-</pre>
-</td>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-<code class="computeroutput"><a class="link" href="../boost/signalN.html" title="Class template signalN">boost::signal0</a></code>&lt;void&gt; sig;
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(1, World());
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(0, Hello());
-sig();
-</pre>
-</td>
-</tr></tbody>
-</table></div>
-<p>This program will correctly print "Hello, World!", because the
-<code class="computeroutput">Hello</code> object is in group 0, which precedes group 1 where
-the <code class="computeroutput">World</code> object resides. The group
-parameter is, in fact, optional. We omitted it in the first Hello,
-World example because it was unnecessary when all of the slots are
-independent. So what happens if we mix calls to connect that use the
-group parameter and those that don't? The "unnamed" slots (i.e., those
-that have been connected without specifying a group name) can be
-placed at the front or back of the slot list (by passing
-<code class="computeroutput">boost::signals::at_front</code> or <code class="computeroutput">boost::signals::at_back</code>
-as the last parameter to <code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>, respectively), and defaults to the end of the list. When
-a group is specified, the final parameter describes where the slot
-will be placed within the group ordering. If we add a new slot
-to our example like this:</p>
-<pre class="programlisting">
-struct GoodMorning
-{
- void operator()() const
- {
- std::cout &lt;&lt; "... and good morning!" &lt;&lt; std::endl;
- }
-};
-
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(GoodMorning());
-</pre>
-<p>... we will get the result we wanted:</p>
-<pre class="programlisting">
-Hello, World!
-... and good morning!
-</pre>
-</div>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="id-1.3.36.4.6"></a>Passing values to and from slots</h3></div></div></div>
-<div class="toc"><dl class="toc">
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.6.2">Slot Arguments (Beginner)</a></span></dt>
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.6.3">Signal Return Values (Advanced)</a></span></dt>
-</dl></div>
-<div class="section">
-<div class="titlepage"><div><div><h4 class="title">
-<a name="id-1.3.36.4.6.2"></a>Slot Arguments (Beginner)</h4></div></div></div>
-<p>Signals can propagate arguments to each of the slots they call.
-For instance, a signal that propagates mouse motion events might
-want to pass along the new mouse coordinates and whether the mouse
-buttons are pressed.</p>
-<p>As an example, we'll create a signal that passes two
-<code class="computeroutput">float</code> arguments to its slots. Then we'll create a few
-slots that print the results of various arithmetic operations on
-these values.</p>
-<pre class="programlisting">
-void print_sum(float x, float y)
-{
- std::cout &lt;&lt; "The sum is " &lt;&lt; x+y &lt;&lt; std::endl;
-}
-
-void print_product(float x, float y)
-{
- std::cout &lt;&lt; "The product is " &lt;&lt; x*y &lt;&lt; std::endl;
-}
-
-void print_difference(float x, float y)
-{
- std::cout &lt;&lt; "The difference is " &lt;&lt; x-y &lt;&lt; std::endl;
-}
-
-void print_quotient(float x, float y)
-{
- std::cout &lt;&lt; "The quotient is " &lt;&lt; x/y &lt;&lt; std::endl;
-}
-</pre>
-<div class="informaltable"><table class="table">
-<colgroup>
-<col>
-<col>
-</colgroup>
-<thead><tr>
-<th align="left">Preferred syntax</th>
-<th align="left">Portable syntax</th>
-</tr></thead>
-<tbody><tr>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-<code class="computeroutput"><a class="link" href="../boost/signal.html" title="Class template signal">boost::signal</a></code>&lt;void (float, float)&gt; sig;
-
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;print_sum);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;print_product);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;print_difference);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;print_quotient);
-
-sig(5, 3);
-</pre>
-</td>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-<code class="computeroutput"><a class="link" href="../boost/signalN.html" title="Class template signalN">boost::signal2</a></code>&lt;void, float, float&gt; sig;
-
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;print_sum);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;print_product);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;print_difference);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;print_quotient);
-
-sig(5, 3);
-</pre>
-</td>
-</tr></tbody>
-</table></div>
-<p>This program will print out the following:</p>
-<pre class="programlisting">
-The sum is 8
-The product is 15
-The difference is 2
-The quotient is 1.66667
-</pre>
-<p>So any values that are given to <code class="computeroutput">sig</code> when it is
-called like a function are passed to each of the slots. We have to
-declare the types of these values up front when we create the
-signal. The type <code class="computeroutput"><a class="link" href="../boost/signal.html" title="Class template signal">boost::signal</a>&lt;void (float,
-float)&gt;</code> means that the signal has a <code class="computeroutput">void</code>
-return value and takes two <code class="computeroutput">float</code> values. Any slot
-connected to <code class="computeroutput">sig</code> must therefore be able to take two
-<code class="computeroutput">float</code> values.</p>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h4 class="title">
-<a name="id-1.3.36.4.6.3"></a>Signal Return Values (Advanced)</h4></div></div></div>
-<p>Just as slots can receive arguments, they can also return
-values. These values can then be returned back to the caller of the
-signal through a <em class="firstterm">combiner</em>. The combiner is a mechanism
-that can take the results of calling slots (there many be no
-results or a hundred; we don't know until the program runs) and
-coalesces them into a single result to be returned to the caller.
-The single result is often a simple function of the results of the
-slot calls: the result of the last slot call, the maximum value
-returned by any slot, or a container of all of the results are some
-possibilities.</p>
-<p>We can modify our previous arithmetic operations example
-slightly so that the slots all return the results of computing the
-product, quotient, sum, or difference. Then the signal itself can
-return a value based on these results to be printed:</p>
-<div class="informaltable"><table class="table">
-<colgroup>
-<col>
-<col>
-</colgroup>
-<thead><tr>
-<th align="left">Preferred syntax</th>
-<th align="left">Portable syntax</th>
-</tr></thead>
-<tbody><tr>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-float product(float x, float y) { return x*y; }
-float quotient(float x, float y) { return x/y; }
-float sum(float x, float y) { return x+y; }
-float difference(float x, float y) { return x-y; }
-
-<code class="computeroutput"><a class="link" href="../boost/signal.html" title="Class template signal">boost::signal</a></code>&lt;float (float x, float y)&gt; sig;
-
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;product);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;quotient);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;sum);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;difference);
-
-std::cout &lt;&lt; sig(5, 3) &lt;&lt; std::endl;
-</pre>
-</td>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-float product(float x, float y) { return x*y; }
-float quotient(float x, float y) { return x/y; }
-float sum(float x, float y) { return x+y; }
-float difference(float x, float y) { return x-y; }
-
-<code class="computeroutput"><a class="link" href="../boost/signalN.html" title="Class template signalN">boost::signal2</a></code>&lt;float, float, float&gt; sig;
-
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;product);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;quotient);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;sum);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;difference);
-
-std::cout &lt;&lt; sig(5, 3) &lt;&lt; std::endl;
-</pre>
-</td>
-</tr></tbody>
-</table></div>
-<p>This example program will output <code class="computeroutput">2</code>. This is because the
-default behavior of a signal that has a return type
-(<code class="computeroutput">float</code>, the first template argument given to the
-<code class="computeroutput"><a class="link" href="../boost/signal.html" title="Class template signal">boost::signal</a></code> class template) is to call all slots and
-then return the result returned by the last slot called. This
-behavior is admittedly silly for this example, because slots have
-no side effects and the result is the last slot connect.</p>
-<p>A more interesting signal result would be the maximum of the
-values returned by any slot. To do this, we create a custom
-combiner that looks like this:</p>
-<pre class="programlisting">
-template&lt;typename T&gt;
-struct maximum
-{
- typedef T result_type;
-
- template&lt;typename InputIterator&gt;
- T operator()(InputIterator first, InputIterator last) const
- {
- // If there are no slots to call, just return the
- // default-constructed value
- if (first == last)
- return T();
-
- T max_value = *first++;
- while (first != last) {
- if (max_value &lt; *first)
- max_value = *first;
- ++first;
- }
-
- return max_value;
- }
-};
-</pre>
-<p>The <code class="computeroutput">maximum</code> class template acts as a function
-object. Its result type is given by its template parameter, and
-this is the type it expects to be computing the maximum based on
-(e.g., <code class="computeroutput">maximum&lt;float&gt;</code> would find the maximum
-<code class="computeroutput">float</code> in a sequence of <code class="computeroutput">float</code>s). When a
-<code class="computeroutput">maximum</code> object is invoked, it is given an input
-iterator sequence <code class="computeroutput">[first, last)</code> that includes the
-results of calling all of the slots. <code class="computeroutput">maximum</code> uses this
-input iterator sequence to calculate the maximum element, and
-returns that maximum value.</p>
-<p>We actually use this new function object type by installing it
-as a combiner for our signal. The combiner template argument
-follows the signal's calling signature:</p>
-<div class="informaltable"><table class="table">
-<colgroup>
-<col>
-<col>
-</colgroup>
-<thead><tr>
-<th align="left">Preferred syntax</th>
-<th align="left">Portable syntax</th>
-</tr></thead>
-<tbody><tr>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-<code class="computeroutput"><a class="link" href="../boost/signal.html" title="Class template signal">boost::signal</a></code>&lt;float (float x, float y),
- maximum&lt;float&gt; &gt; sig;
-</pre>
-</td>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-<code class="computeroutput"><a class="link" href="../boost/signalN.html" title="Class template signalN">boost::signal2</a></code>&lt;float, float, float,
- maximum&lt;float&gt; &gt; sig;
-</pre>
-</td>
-</tr></tbody>
-</table></div>
-<p>Now we can connect slots that perform arithmetic functions and
-use the signal:</p>
-<pre class="programlisting">
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;quotient);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;product);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;sum);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;difference);
-
-std::cout &lt;&lt; sig(5, 3) &lt;&lt; std::endl;
-</pre>
-<p>The output of this program will be <code class="computeroutput">15</code>, because
-regardless of the order in which the slots are connected, the product
-of 5 and 3 will be larger than the quotient, sum, or
-difference.</p>
-<p>In other cases we might want to return all of the values
-computed by the slots together, in one large data structure. This
-is easily done with a different combiner:</p>
-<pre class="programlisting">
-template&lt;typename Container&gt;
-struct aggregate_values
-{
- typedef Container result_type;
-
- template&lt;typename InputIterator&gt;
- Container operator()(InputIterator first, InputIterator last) const
- {
- return Container(first, last);
- }
-};
-</pre>
-<p>
-Again, we can create a signal with this new combiner:
-</p>
-<div class="informaltable"><table class="table">
-<colgroup>
-<col>
-<col>
-</colgroup>
-<thead><tr>
-<th align="left">Preferred syntax</th>
-<th align="left">Portable syntax</th>
-</tr></thead>
-<tbody><tr>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-<code class="computeroutput"><a class="link" href="../boost/signal.html" title="Class template signal">boost::signal</a></code>&lt;float (float, float),
- aggregate_values&lt;std::vector&lt;float&gt; &gt; &gt; sig;
-
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;quotient);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;product);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;sum);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;difference);
-
-std::vector&lt;float&gt; results = sig(5, 3);
-std::copy(results.begin(), results.end(),
- std::ostream_iterator&lt;float&gt;(cout, " "));
-</pre>
-</td>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-<code class="computeroutput"><a class="link" href="../boost/signalN.html" title="Class template signalN">boost::signal2</a></code>&lt;float, float, float,
- aggregate_values&lt;std::vector&lt;float&gt; &gt; &gt; sig;
-
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;quotient);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;product);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;sum);
-sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(&amp;difference);
-
-std::vector&lt;float&gt; results = sig(5, 3);
-std::copy(results.begin(), results.end(),
- std::ostream_iterator&lt;float&gt;(cout, " "));
-</pre>
-</td>
-</tr></tbody>
-</table></div>
-<p>The output of this program will contain 15, 8, 1.6667, and 2. It
-is interesting here that
-the first template argument for the <code class="computeroutput">signal</code> class,
-<code class="computeroutput">float</code>, is not actually the return type of the signal.
-Instead, it is the return type used by the connected slots and will
-also be the <code class="computeroutput">value_type</code> of the input iterators passed
-to the combiner. The combiner itself is a function object and its
-<code class="computeroutput">result_type</code> member type becomes the return type of the
-signal.</p>
-<p>The input iterators passed to the combiner transform dereference
-operations into slot calls. Combiners therefore have the option to
-invoke only some slots until some particular criterion is met. For
-instance, in a distributed computing system, the combiner may ask
-each remote system whether it will handle the request. Only one
-remote system needs to handle a particular request, so after a
-remote system accepts the work we do not want to ask any other
-remote systems to perform the same task. Such a combiner need only
-check the value returned when dereferencing the iterator, and
-return when the value is acceptable. The following combiner returns
-the first non-NULL pointer to a <code class="computeroutput">FulfilledRequest</code> data
-structure, without asking any later slots to fulfill the
-request:</p>
-<pre class="programlisting">
-struct DistributeRequest {
- typedef FulfilledRequest* result_type;
-
- template&lt;typename InputIterator&gt;
- result_type operator()(InputIterator first, InputIterator last) const
- {
- while (first != last) {
- if (result_type fulfilled = *first)
- return fulfilled;
- ++first;
- }
- return 0;
- }
-};
-</pre>
-</div>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="id-1.3.36.4.7"></a>Connection Management</h3></div></div></div>
-<div class="toc"><dl class="toc">
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.7.2">Disconnecting Slots (Beginner)</a></span></dt>
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.7.3">Blocking Slots (Beginner)</a></span></dt>
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.7.4">Scoped connections (Intermediate)</a></span></dt>
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.7.5">Disconnecting equivalent slots (Intermediate)</a></span></dt>
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.7.6">Automatic connection management (Intermediate)</a></span></dt>
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.7.7">When can disconnections occur? (Intermediate)</a></span></dt>
-<dt><span class="section"><a href="tutorial.html#id-1.3.36.4.7.8">Passing slots (Intermediate)</a></span></dt>
-</dl></div>
-<div class="section">
-<div class="titlepage"><div><div><h4 class="title">
-<a name="id-1.3.36.4.7.2"></a>Disconnecting Slots (Beginner)</h4></div></div></div>
-<p>Slots aren't expected to exist indefinately after they are
-connected. Often slots are only used to receive a few events and
-are then disconnected, and the programmer needs control to decide
-when a slot should no longer be connected.</p>
-<p>The entry point for managing connections explicitly is the
-<code class="computeroutput"><a class="link" href="../boost/signals/connection.html" title="Class connection">boost::signals::connection</a></code> class. The
-<code class="computeroutput"><a class="link" href="../boost/signals/connection.html" title="Class connection">connection</a></code> class uniquely represents the connection
-between a particular signal and a particular slot. The
-<code class="computeroutput"><a class="link" href="../boost/signals/connection.html#id-1_3_36_5_4_1_1_1_6_2-bb">connected</a>()</code> method checks if the signal and slot are
-still connected, and the <code class="computeroutput"><a class="link" href="../boost/signals/connection.html#id-1_3_36_5_4_1_1_1_6_1-bb">disconnect()</a></code> method
-disconnects the signal and slot if they are connected before it is
-called. Each call to the signal's <code class="computeroutput">connect()</code> method
-returns a connection object, which can be used to determine if the
-connection still exists or to disconnect the signal and slot.</p>
-<pre class="programlisting">
-boost::signals::connection c = sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(HelloWorld());
-if (c.<code class="computeroutput">connected</code>()) {
-<span class="emphasis"><em>// c is still connected to the signal</em></span>
- sig(); <span class="emphasis"><em>// Prints "Hello, World!"</em></span>
-}
-
-c.disconnect(); <span class="emphasis"><em>// Disconnect the HelloWorld object</em></span>
-assert(!c.<code class="computeroutput">connected</code>()); <span class="emphasis"><em>c isn't connected any more</em></span>
-
-sig(); <span class="emphasis"><em>// Does nothing: there are no connected slots</em></span>
-</pre>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h4 class="title">
-<a name="id-1.3.36.4.7.3"></a>Blocking Slots (Beginner)</h4></div></div></div>
-<p>Slots can be temporarily "blocked", meaning that they will be
-ignored when the signal is invoked but have not been disconnected. The
-<code class="computeroutput">block</code> member function
-temporarily blocks a slot, which can be unblocked via
-<code class="computeroutput">unblock</code>. Here is an example of
-blocking/unblocking slots:</p>
-<pre class="programlisting">
-boost::signals::connection c = sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(HelloWorld());
-sig(); <span class="emphasis"><em>// Prints "Hello, World!"</em></span>
-
-c.<code class="computeroutput">block</code>(); <span class="emphasis"><em>// block the slot</em></span>
-assert(c.<code class="computeroutput">blocked</code>());
-sig(); <span class="emphasis"><em>// No output: the slot is blocked</em></span>
-
-c.<code class="computeroutput">unblock</code>(); <span class="emphasis"><em>// unblock the slot</em></span>
-sig(); <span class="emphasis"><em>// Prints "Hello, World!"</em></span>
-</pre>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h4 class="title">
-<a name="id-1.3.36.4.7.4"></a>Scoped connections (Intermediate)</h4></div></div></div>
-<p>The <code class="computeroutput">boost::signals::scoped_connection</code> class
-references a signal/slot connection that will be disconnected when
-the <code class="computeroutput">scoped_connection</code> class goes out of scope. This
-ability is useful when a connection need only be temporary,
-e.g.,</p>
-<pre class="programlisting">
-{
- boost::signals::scoped_connection c = sig.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(ShortLived());
- sig(); <span class="emphasis"><em>// will call ShortLived function object</em></span>
-}
-sig(); <span class="emphasis"><em>// ShortLived function object no longer connected to sig</em></span>
-</pre>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h4 class="title">
-<a name="id-1.3.36.4.7.5"></a>Disconnecting equivalent slots (Intermediate)</h4></div></div></div>
-<p>One can disconnect slots that are equivalent to a given function
-object using a form of the
-<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_2-bb">disconnect</a></code> method, so long as
-the type of the function object has an accessible <code class="computeroutput">==</code>
-operator. For instance:
-
-</p>
-<div class="informaltable"><table class="table">
-<colgroup>
-<col>
-<col>
-</colgroup>
-<thead><tr>
-<th align="left">Preferred syntax</th>
-<th align="left">Portable syntax</th>
-</tr></thead>
-<tbody><tr>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-void foo();
-void bar();
-
-signal&lt;void()&gt; sig;
-
-sig.connect(&amp;foo);
-sig.connect(&amp;bar);
-
-// disconnects foo, but not bar
-sig.disconnect(&amp;foo);
-</pre>
-</td>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-void foo();
-void bar();
-
-signal0&lt;void&gt; sig;
-
-sig.connect(&amp;foo);
-sig.connect(&amp;bar);
-
-// disconnects foo, but not bar
-sig.disconnect(&amp;foo);
-</pre>
-</td>
-</tr></tbody>
-</table></div>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h4 class="title">
-<a name="id-1.3.36.4.7.6"></a>Automatic connection management (Intermediate)</h4></div></div></div>
-<p>Boost.Signals can automatically track the lifetime of objects
-involved in signal/slot connections, including automatic
-disconnection of slots when objects involved in the slot call are
-destroyed. For instance, consider a simple news delivery service,
-where clients connect to a news provider that then sends news to
-all connected clients as information arrives. The news delivery
-service may be constructed like this: </p>
-<div class="informaltable"><table class="table">
-<colgroup>
-<col>
-<col>
-</colgroup>
-<thead><tr>
-<th align="left">Preferred syntax</th>
-<th align="left">Portable syntax</th>
-</tr></thead>
-<tbody><tr>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-class NewsItem { /* ... */ };
-
-boost::signal&lt;void (const NewsItem&amp;)&gt; deliverNews;
-</pre>
-</td>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-class NewsItem { /* ... */ };
-
-boost::signal1&lt;void, const NewsItem&amp;&gt; deliverNews;
-</pre>
-</td>
-</tr></tbody>
-</table></div>
-<p>Clients that wish to receive news updates need only connect a
-function object that can receive news items to the
-<code class="computeroutput">deliverNews</code> signal. For instance, we may have a
-special message area in our application specifically for news,
-e.g.,:</p>
-<pre class="programlisting">
-struct NewsMessageArea : public MessageArea
-{
-public:
- // ...
-
- void displayNews(const NewsItem&amp; news) const
- {
- messageText = news.text();
- update();
- }
-};
-
-// ...
-NewsMessageArea newsMessageArea = new NewsMessageArea(/* ... */);
-// ...
-deliverNews.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(boost::bind(&amp;NewsMessageArea::displayNews,
- newsMessageArea, _1));
-</pre>
-<p>However, what if the user closes the news message area,
-destroying the <code class="computeroutput">newsMessageArea</code> object that
-<code class="computeroutput">deliverNews</code> knows about? Most likely, a segmentation
-fault will occur. However, with Boost.Signals one need only make
-<code class="computeroutput">NewsMessageArea</code> <span class="emphasis"><em>trackable</em></span>, and the slot
-involving <code class="computeroutput">newsMessageArea</code> will be disconnected when
-<code class="computeroutput">newsMessageArea</code> is destroyed. The
-<code class="computeroutput">NewsMessageArea</code> class is made trackable by deriving
-publicly from the <code class="computeroutput">boost::signals::trackable</code> class,
-e.g.:</p>
-<pre class="programlisting">
-struct NewsMessageArea : public MessageArea, public boost::signals::trackable
-{
- // ...
-};
-</pre>
-<p>At this time there is a significant limitation to the use of
-<code class="computeroutput">trackable</code> objects in making slot connections: function
-objects built using Boost.Bind are understood, such that pointers
-or references to <code class="computeroutput">trackable</code> objects passed to
-<code class="computeroutput">boost::bind</code> will be found and tracked.</p>
-<p><span class="bold"><strong>Warning</strong></span>: User-defined function objects and function
-objects from other libraries (e.g., Boost.Function or Boost.Lambda)
-do not implement the required interfaces for <code class="computeroutput">trackable</code>
-object detection, and <span class="emphasis"><em>will silently ignore any bound trackable
-objects</em></span>. Future versions of the Boost libraries will address
-this limitation.</p>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h4 class="title">
-<a name="id-1.3.36.4.7.7"></a>When can disconnections occur? (Intermediate)</h4></div></div></div>
-<p>Signal/slot disconnections occur when any of these conditions
-occur:</p>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<li class="listitem"><p>The connection is explicitly disconnected via the connection's
-<code class="computeroutput">disconnect</code> method directly, or indirectly via the
-signal's <code class="computeroutput">disconnect</code> method or
-<code class="computeroutput">scoped_connection</code>'s destructor.</p></li>
-<li class="listitem"><p>A <code class="computeroutput">trackable</code> object bound to the slot is
-destroyed.</p></li>
-<li class="listitem"><p>The signal is destroyed.</p></li>
-</ul></div>
-<p>These events can occur at any time without disrupting a signal's
-calling sequence. If a signal/slot connection is disconnected at
-any time during a signal's calling sequence, the calling sequence
-will still continue but will not invoke the disconnected slot.
-Additionally, a signal may be destroyed while it is in a calling
-sequence, and which case it will complete its slot call sequence
-but may not be accessed directly.</p>
-<p>Signals may be invoked recursively (e.g., a signal A calls a
-slot B that invokes signal A...). The disconnection behavior does
-not change in the recursive case, except that the slot calling
-sequence includes slot calls for all nested invocations of the
-signal.</p>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h4 class="title">
-<a name="id-1.3.36.4.7.8"></a>Passing slots (Intermediate)</h4></div></div></div>
-<p>Slots in the Boost.Signals library are created from arbitrary
-function objects, and therefore have no fixed type. However, it is
-commonplace to require that slots be passed through interfaces that
-cannot be templates. Slots can be passed via the
-<code class="computeroutput">slot_type</code> for each particular signal type and any
-function object compatible with the signature of the signal can be
-passed to a <code class="computeroutput">slot_type</code> parameter. For instance:</p>
-<div class="informaltable"><table class="table">
-<colgroup>
-<col>
-<col>
-</colgroup>
-<thead><tr>
-<th align="left">Preferred syntax</th>
-<th align="left">Portable syntax</th>
-</tr></thead>
-<tbody><tr>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-class Button
-{
- typedef boost::signal&lt;void (int x, int y)&gt; OnClick;
-
-public:
- void doOnClick(const OnClick::slot_type&amp; slot);
-
-private:
- OnClick onClick;
-};
-
-void Button::doOnClick(
- const OnClick::slot_type&amp; slot
- )
-{
- onClick.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(slot);
-}
-
-void printCoordinates(long x, long y)
-{
- std::cout &lt;&lt; "(" &lt;&lt; x &lt;&lt; ", " &lt;&lt; y &lt;&lt; ")\n";
-}
-
-void f(Button&amp; button)
-{
- button.doOnClick(&amp;printCoordinates);
-}
-</pre>
-</td>
-<td align="left">
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting">
-class Button
-{
- typedef <code class="computeroutput"><a class="link" href="../boost/signalN.html" title="Class template signalN">boost::signal2</a></code>&lt;void,int,int&gt; OnClick;
-
-public:
- void doOnClick(const OnClick::slot_type&amp; slot);
-
-private:
- OnClick onClick;
-};
-
-void Button::doOnClick(
- const OnClick::slot_type&amp; slot
- )
-{
- onClick.<code class="computeroutput"><a class="link" href="../boost/signalN.html#id-1_3_36_5_1_1_2_24_1-bb">connect</a></code>(slot);
-}
-
-void printCoordinates(long x, long y)
-{
- std::cout &lt;&lt; "(" &lt;&lt; x &lt;&lt; ", " &lt;&lt; y &lt;&lt; ")\n";
-}
-
-void f(Button&amp; button)
-{
- button.doOnClick(&amp;printCoordinates);
-}
-</pre>
-</td>
-</tr></tbody>
-</table></div>
-<p>The <code class="computeroutput">doOnClick</code> method is now functionally equivalent
-to the <code class="computeroutput">connect</code> method of the <code class="computeroutput">onClick</code>
-signal, but the details of the <code class="computeroutput">doOnClick</code> method can be
-hidden in an implementation detail file.</p>
-</div>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="id-1.3.36.4.8"></a>Example: Document-View</h3></div></div></div>
-<p>Signals can be used to implement flexible Document-View
- architectures. The document will contain a signal to which each of
- the views can connect. The following <code class="computeroutput">Document</code> class
- defines a simple text document that supports mulitple views. Note
- that it stores a single signal to which all of the views will be
- connected.</p>
-<pre class="programlisting">class Document
-{
-public:
- typedef boost::signal&lt;void (bool)&gt; signal_t;
- typedef boost::signals::connection connection_t;
-
-public:
- Document()
- {}
-
- connection_t connect(signal_t::slot_function_type subscriber)
- {
- return m_sig.connect(subscriber);
- }
-
- void disconnect(connection_t subscriber)
- {
- subscriber.disconnect();
- }
-
- void append(const char* s)
- {
- m_text += s;
- m_sig(true);
- }
-
- const std::string&amp; getText() const
- {
- return m_text;
- }
-
-private:
- signal_t m_sig;
- std::string m_text;
-};</pre>
-<p>Next, we can define a <code class="computeroutput">View</code> base class from which
- views can derive. This isn't strictly required, but it keeps the
- Document-View logic separate from the logic itself. Note that the
- constructor just connects the view to the document and the
- destructor disconnects the view.</p>
-<pre class="programlisting">
-class View
-{
-public:
- View(Document&amp; m)
- : m_document(m)
- {
- m_connection = m_document.connect(boost::bind(&amp;View::refresh, this, _1));
- }
-
- virtual ~View()
- {
- m_document.disconnect(m_connection);
- }
-
- virtual void refresh(bool bExtended) const = 0;
-
-protected:
- Document&amp; m_document;
-
-private:
- Document::connection_t m_connection;
-};
- </pre>
-<p>Finally, we can begin to define views. The
- following <code class="computeroutput">TextView</code> class provides a simple view of the
- document text.</p>
-<pre class="programlisting">class TextView : public View
-{
-public:
- TextView(Document&amp; doc)
- : View(doc)
- {}
-
- virtual void refresh(bool bExtended) const
- {
- std::cout &lt;&lt; "TextView: " &lt;&lt; m_document.getText() &lt;&lt; std::endl;
- }
-};</pre>
-<p>Alternatively, we can provide a view of the document
- translated into hex values using the <code class="computeroutput">HexView</code>
- view:</p>
-<pre class="programlisting">class HexView : public View
-{
-public:
- HexView(Document&amp; doc)
- : View(doc)
- {}
-
- virtual void refresh(bool bExtended) const
- {
- const std::string&amp; s = m_document.getText();
-
- std::cout &lt;&lt; "HexView:";
-
- for (std::string::const_iterator it = s.begin(); it != s.end(); ++it)
- std::cout &lt;&lt; ' ' &lt;&lt; std::hex &lt;&lt; static_cast&lt;int&gt;(*it);
-
- std::cout &lt;&lt; std::endl;
- }
-};</pre>
-<p>To tie the example together, here is a
- simple <code class="computeroutput">main</code> function that sets up two views and then
- modifies the document:</p>
-<pre class="programlisting">int main(int argc, char* argv[])
-{
- Document doc;
- TextView v1(doc);
- HexView v2(doc);
-
- doc.append(argc == 2 ? argv[1] : "Hello world!");
- return 0;
-}</pre>
-<p>The complete example source, contributed by Keith MacDonald,
- is available in <a href="../../../libs/signals/example/doc_view.cpp" target="_top"><code class="computeroutput">libs/signals/example/doc_view.cpp</code></a>.</p>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="id-1.3.36.4.9"></a>Linking against the Signals library</h3></div></div></div>
-<p>Part of the Boost.Signals library is compiled into a binary
- library that must be linked into your application to use
- Signals. Please refer to
- the <a href="../../../more/getting_started.html" target="_top">Getting Started</a>
- guide. You will need to link against the <code class="computeroutput">boost_signals</code>
- library.</p>
-</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; 2001-2004 Douglas Gregor<p>Use, modification and distribution is subject to 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="../signals.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../signals.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="reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
-</div>
-</body>
-</html>