mirror of
https://github.com/boostorg/bind.git
synced 2026-04-13 21:25:59 +02:00
Compare commits
15 Commits
boost-1.59
...
boost-1.60
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4300db5db8 | ||
|
|
017258c983 | ||
|
|
90bd9b1684 | ||
|
|
20a07a05f7 | ||
|
|
8647ccca80 | ||
|
|
5727d4f46e | ||
|
|
da16abf365 | ||
|
|
2ee272fa8d | ||
|
|
92549594f0 | ||
|
|
37a5201a55 | ||
|
|
6bee84b285 | ||
|
|
cf266d22e4 | ||
|
|
12b976939c | ||
|
|
377014f1a4 | ||
|
|
db56733e4e |
1
doc/.gitignore
vendored
1
doc/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
/html/
|
||||
@@ -27,6 +27,8 @@ boostbook standalone_bind
|
||||
<xsl:param>toc.max.depth=2
|
||||
# How far down we go with TOC's
|
||||
<xsl:param>generate.section.toc.level=0
|
||||
|
||||
<xsl:param>generate.manifest=0
|
||||
;
|
||||
|
||||
xml mem_fn_ : mem_fn.qbk ;
|
||||
@@ -47,4 +49,6 @@ boostbook standalone_mem_fn
|
||||
<xsl:param>toc.max.depth=2
|
||||
# How far down we go with TOC's
|
||||
<xsl:param>generate.section.toc.level=0
|
||||
|
||||
<xsl:param>generate.manifest=0
|
||||
;
|
||||
|
||||
@@ -11,15 +11,15 @@
|
||||
|
||||
[section Files]
|
||||
|
||||
* [@../../include/boost/bind.hpp boost/bind.hpp] (main header)
|
||||
* [@../../include/boost/bind/bind_cc.hpp boost/bind/bind_cc.hpp] (used by `bind.hpp`, do not include directly)
|
||||
* [@../../include/boost/bind/bind_mf_cc.hpp boost/bind/bind_mf_cc.hpp] (used by `bind.hpp`, do not include directly)
|
||||
* [@../../include/boost/bind/bind_template.hpp boost/bind/bind_template.hpp] (used by `bind.hpp`, do not include directly)
|
||||
* [@../../include/boost/bind/arg.hpp boost/bind/arg.hpp] (defines the type of the placeholder arguments)
|
||||
* [@../../include/boost/bind/placeholders.hpp boost/bind/placeholders.hpp] (defines the `_1`, `_2`, ... `_9` placeholders)
|
||||
* [@../../include/boost/bind/apply.hpp boost/bind/apply.hpp] (`apply` helper function object)
|
||||
* [@../../include/boost/bind/protect.hpp boost/bind/protect.hpp] (`protect` helper function)
|
||||
* [@../../include/boost/bind/make_adaptable.hpp boost/bind/make_adaptable.hpp] (`make_adaptable` helper function)
|
||||
* [@../../../../boost/bind.hpp boost/bind.hpp] (main header)
|
||||
* [@../../../../boost/bind/bind_cc.hpp boost/bind/bind_cc.hpp] (used by `bind.hpp`, do not include directly)
|
||||
* [@../../../../boost/bind/bind_mf_cc.hpp boost/bind/bind_mf_cc.hpp] (used by `bind.hpp`, do not include directly)
|
||||
* [@../../../../boost/bind/bind_template.hpp boost/bind/bind_template.hpp] (used by `bind.hpp`, do not include directly)
|
||||
* [@../../../../boost/bind/arg.hpp boost/bind/arg.hpp] (defines the type of the placeholder arguments)
|
||||
* [@../../../../boost/bind/placeholders.hpp boost/bind/placeholders.hpp] (defines the `_1`, `_2`, ... `_9` placeholders)
|
||||
* [@../../../../boost/bind/apply.hpp boost/bind/apply.hpp] (`apply` helper function object)
|
||||
* [@../../../../boost/bind/protect.hpp boost/bind/protect.hpp] (`protect` helper function)
|
||||
* [@../../../../boost/bind/make_adaptable.hpp boost/bind/make_adaptable.hpp] (`make_adaptable` helper function)
|
||||
* [@../../test/bind_test.cpp libs/bind/test/bind_test.cpp] (test)
|
||||
* [@../../bind_as_compose.cpp libs/bind/bind_as_compose.cpp] (function composition example)
|
||||
* [@../../bind_visitor.cpp libs/bind/bind_visitor.cpp] (visitor example)
|
||||
|
||||
@@ -215,7 +215,7 @@ argument, so the example below does not work as expected:
|
||||
The desired effect can be achieved via a helper function object `apply` that
|
||||
applies its first argument, as a function object, to the rest of its argument
|
||||
list. For convenience, an implementation of `apply` is provided in the
|
||||
[@../../include/boost/bind/apply.hpp apply.hpp] header file. Here is how the
|
||||
[@../../../../boost/bind/apply.hpp apply.hpp] header file. Here is how the
|
||||
modified version of the previous example looks like:
|
||||
|
||||
typedef void (*pf)(int);
|
||||
@@ -230,7 +230,7 @@ with the help of another function object, `protect`, that masks the type so
|
||||
that `bind` does not recognize and evaluate it. When called, protect simply
|
||||
forwards the argument list to the other function object unmodified.
|
||||
|
||||
The header [@../../include/boost/bind/protect.hpp protect.hpp] contains an
|
||||
The header [@../../../../boost/bind/protect.hpp protect.hpp] contains an
|
||||
implementation of `protect`. To `protect` a bind function object from
|
||||
evaluation, use `protect(bind(f, ...))`.
|
||||
|
||||
|
||||
@@ -179,9 +179,9 @@ these concepts. This allows unary and binary function objects resulting from
|
||||
[@http://en.cppreference.com/w/cpp/utility/functional/unary_negate `std::unary_negate`]
|
||||
and [@http://en.cppreference.com/w/cpp/utility/functional/binary_negate `std::binary_negate`].
|
||||
|
||||
The `make_adaptable` function is defined in [@../../include/boost/bind/make_adaptable.hpp
|
||||
The `make_adaptable` function is defined in [@../../../../boost/bind/make_adaptable.hpp
|
||||
`<boost/bind/make_adaptable.hpp>`], which must be included explicitly in
|
||||
addition to [@../../include/boost/bind.hpp `<boost/bind.hpp>`]:
|
||||
addition to [@../../../../boost/bind.hpp `<boost/bind.hpp>`]:
|
||||
|
||||
#include <boost/bind/make_adaptable.hpp>
|
||||
|
||||
|
||||
1552
doc/html/bind.html
Normal file
1552
doc/html/bind.html
Normal file
File diff suppressed because it is too large
Load Diff
552
doc/html/mem_fn.html
Normal file
552
doc/html/mem_fn.html
Normal file
@@ -0,0 +1,552 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Chapter 1. Boost.Member Function</title>
|
||||
<link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
|
||||
<link rel="home" href="mem_fn.html" title="Chapter 1. Boost.Member Function">
|
||||
</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"></div>
|
||||
<div class="chapter">
|
||||
<div class="titlepage"><div>
|
||||
<div><h2 class="title">
|
||||
<a name="mem_fn"></a>Chapter 1. Boost.Member Function</h2></div>
|
||||
<div><p class="copyright">Copyright © 2001, 2002 Peter Dimov and Multi Media Ltd.</p></div>
|
||||
<div><p class="copyright">Copyright © 2003-2005 Peter Dimov</p></div>
|
||||
<div><div class="legalnotice">
|
||||
<a name="mem_fn.legal"></a><p>
|
||||
Distributed under the <a href="http://boost.org/LICENSE_1_0.txt" target="_top">Boost
|
||||
Software License, Version 1.0</a>.
|
||||
</p>
|
||||
</div></div>
|
||||
</div></div>
|
||||
<div class="toc">
|
||||
<p><b>Table of Contents</b></p>
|
||||
<dl class="toc">
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.purpose">Purpose</a></span></dt>
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.faq">Frequently Asked Questions</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.faq.can_mem_fn_be_used_instead_of_th">Can <code class="computeroutput"><span class="identifier">mem_fn</span></code> be used instead of the standard <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">mem_fun</span><span class="special">[</span><span class="identifier">_ref</span><span class="special">]</span></code>
|
||||
adaptors?</a></span></dt>
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.faq.should_i_replace_every_occurence">Should I
|
||||
replace every occurence of <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">mem_fun</span><span class="special">[</span><span class="identifier">_ref</span><span class="special">]</span></code>
|
||||
with <code class="computeroutput"><span class="identifier">mem_fn</span></code> in my existing
|
||||
code?</a></span></dt>
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.faq.does_mem_fn_work_with_com_method">Does <code class="computeroutput"><span class="identifier">mem_fn</span></code> work with COM methods?</a></span></dt>
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.faq.why_isn_t_boost_mem_fn_enable_st">Why isn't
|
||||
<code class="computeroutput"><span class="identifier">BOOST_MEM_FN_ENABLE_STDCALL</span></code>
|
||||
defined automatically?</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.interface">Interface</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.interface.synopsys">Synopsis</a></span></dt>
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.interface.common_requirements">Common requirements</a></span></dt>
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.interface.get_pointer"><code class="computeroutput"><span class="identifier">get_pointer</span></code></a></span></dt>
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.interface.mem_fn"><code class="computeroutput"><span class="identifier">mem_fn</span></code></a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.implementation">Implementation</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.implementation.files">Files</a></span></dt>
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.implementation.dependencies">Dependencies</a></span></dt>
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.implementation.number_of_arguments">Number of
|
||||
Arguments</a></span></dt>
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.implementation.stdcall"><code class="computeroutput"><span class="identifier">__stdcall</span></code>,
|
||||
<code class="computeroutput"><span class="identifier">__cdecl</span></code>, and <code class="computeroutput"><span class="identifier">__fastcall</span></code> Support</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="mem_fn.html#mem_fn.acknowledgements">Acknowledgements</a></span></dt>
|
||||
</dl>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="mem_fn.purpose"></a><a class="link" href="mem_fn.html#mem_fn.purpose" title="Purpose">Purpose</a>
|
||||
</h2></div></div></div>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mem_fn</span></code> is a generalization of the standard
|
||||
functions <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">mem_fun</span></code> and <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">mem_fun_ref</span></code>.
|
||||
It supports member function pointers with more than one argument, and the returned
|
||||
function object can take a pointer, a reference, or a smart pointer to an object
|
||||
instance as its first argument. <code class="computeroutput"><span class="identifier">mem_fn</span></code>
|
||||
also supports pointers to data members by treating them as functions taking
|
||||
no arguments and returning a (const) reference to the member.
|
||||
</p>
|
||||
<p>
|
||||
The purpose of <code class="computeroutput"><span class="identifier">mem_fn</span></code> is twofold.
|
||||
First, it allows users to invoke a member function on a container with the
|
||||
familiar
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mem_fn</span><span class="special">(&</span><span class="identifier">Shape</span><span class="special">::</span><span class="identifier">draw</span><span class="special">));</span>
|
||||
</pre>
|
||||
<p>
|
||||
syntax, even when the container stores smart pointers.
|
||||
</p>
|
||||
<p>
|
||||
Second, it can be used as a building block by library developers that want
|
||||
to treat a pointer to member function as a function object. A library might
|
||||
define an enhanced <code class="computeroutput"><span class="identifier">for_each</span></code>
|
||||
algorithm with an overload of the form:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">It</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">for_each</span><span class="special">(</span><span class="identifier">It</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">It</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">pmf</span><span class="special">)</span> <span class="special">())</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mem_fn</span><span class="special">(</span><span class="identifier">pmf</span><span class="special">));</span>
|
||||
<span class="special">}</span>
|
||||
</pre>
|
||||
<p>
|
||||
that will allow the convenient syntax:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="special">&</span><span class="identifier">Shape</span><span class="special">::</span><span class="identifier">draw</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
When documenting the feature, the library author will simply state:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">It</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">for_each</span><span class="special">(</span><span class="identifier">It</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">It</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">pmf</span><span class="special">)</span> <span class="special">());</span>
|
||||
</pre>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
|
||||
<span class="emphasis"><em>Effects:</em></span> Equivalent to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mem_fn</span><span class="special">(</span><span class="identifier">pmf</span><span class="special">))</span></code>.
|
||||
</li></ul></div>
|
||||
<p>
|
||||
where <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mem_fn</span></code> can be a link to this page. See the
|
||||
<a href="../../../../libs/bind/bind.html" target="_top">documentation of <code class="computeroutput"><span class="identifier">bind</span></code></a>
|
||||
for an example.
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">mem_fn</span></code> takes one argument,
|
||||
a pointer to a member, and returns a function object suitable for use with
|
||||
standard or user-defined algorithms:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">X</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">void</span> <span class="identifier">f</span><span class="special">();</span>
|
||||
<span class="special">};</span>
|
||||
|
||||
<span class="keyword">void</span> <span class="identifier">g</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">X</span><span class="special">></span> <span class="special">&</span> <span class="identifier">v</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mem_fn</span><span class="special">(&</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">));</span>
|
||||
<span class="special">};</span>
|
||||
|
||||
<span class="keyword">void</span> <span class="identifier">h</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">X</span> <span class="special">*></span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">v</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mem_fn</span><span class="special">(&</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">));</span>
|
||||
<span class="special">};</span>
|
||||
|
||||
<span class="keyword">void</span> <span class="identifier">k</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">X</span><span class="special">></span> <span class="special">></span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">v</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mem_fn</span><span class="special">(&</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">));</span>
|
||||
<span class="special">};</span>
|
||||
</pre>
|
||||
<p>
|
||||
The returned function object takes the same arguments as the input member function
|
||||
plus a "flexible" first argument that represents the object instance.
|
||||
</p>
|
||||
<p>
|
||||
When the function object is invoked with a first argument <code class="computeroutput"><span class="identifier">x</span></code>
|
||||
that is neither a pointer nor a reference to the appropriate class (<code class="computeroutput"><span class="identifier">X</span></code> in the example above), it uses <code class="computeroutput"><span class="identifier">get_pointer</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code> to obtain
|
||||
a pointer from <code class="computeroutput"><span class="identifier">x</span></code>. Library authors
|
||||
can "register" their smart pointer classes by supplying an appropriate
|
||||
<code class="computeroutput"><span class="identifier">get_pointer</span></code> overload, allowing
|
||||
<code class="computeroutput"><span class="identifier">mem_fn</span></code> to recognize and support
|
||||
them.
|
||||
</p>
|
||||
<p>
|
||||
<span class="emphasis"><em>[Note:</em></span> <code class="computeroutput"><span class="identifier">get_pointer</span></code>
|
||||
is not restricted to return a pointer. Any object that can be used in a member
|
||||
function call expression <code class="computeroutput"><span class="special">(</span><span class="identifier">x</span><span class="special">->*</span><span class="identifier">pmf</span><span class="special">)(...)</span></code> will work.<span class="emphasis"><em>]</em></span>
|
||||
</p>
|
||||
<p>
|
||||
<span class="emphasis"><em>[Note:</em></span> the library uses an unqualified call to <code class="computeroutput"><span class="identifier">get_pointer</span></code>. Therefore, it will find, through
|
||||
argument-dependent lookup, <code class="computeroutput"><span class="identifier">get_pointer</span></code>
|
||||
overloads that are defined in the same namespace as the corresponding smart
|
||||
pointer class, in addition to any <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">get_pointer</span></code>
|
||||
overloads.<span class="emphasis"><em>]</em></span>
|
||||
</p>
|
||||
<p>
|
||||
All function objects returned by <code class="computeroutput"><span class="identifier">mem_fn</span></code>
|
||||
expose a <code class="computeroutput"><span class="identifier">result_type</span></code> typedef
|
||||
that represents the return type of the member function. For data members,
|
||||
<code class="computeroutput"><span class="identifier">result_type</span></code> is defined as the
|
||||
type of the member.
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="mem_fn.faq"></a><a class="link" href="mem_fn.html#mem_fn.faq" title="Frequently Asked Questions">Frequently Asked Questions</a>
|
||||
</h2></div></div></div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="mem_fn.faq.can_mem_fn_be_used_instead_of_th"></a><a class="link" href="mem_fn.html#mem_fn.faq.can_mem_fn_be_used_instead_of_th" title="Can mem_fn be used instead of the standard std::mem_fun[_ref] adaptors?">Can <code class="computeroutput"><span class="identifier">mem_fn</span></code> be used instead of the standard <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">mem_fun</span><span class="special">[</span><span class="identifier">_ref</span><span class="special">]</span></code>
|
||||
adaptors?</a>
|
||||
</h3></div></div></div>
|
||||
<p>
|
||||
Yes. For simple uses, <code class="computeroutput"><span class="identifier">mem_fn</span></code>
|
||||
provides additional functionality that the standard adaptors do not. Complicated
|
||||
expressions that use <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bind1st</span></code>,
|
||||
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bind2nd</span></code> or <a href="http://www.boost.org/doc/libs/1_31_0/libs/compose/index.htm" target="_top">Boost.Compose</a>
|
||||
along with the standard adaptors can be rewritten using <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span></code>
|
||||
that automatically takes advantage of <code class="computeroutput"><span class="identifier">mem_fn</span></code>.
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="mem_fn.faq.should_i_replace_every_occurence"></a><a class="link" href="mem_fn.html#mem_fn.faq.should_i_replace_every_occurence" title="Should I replace every occurence of std::mem_fun[_ref] with mem_fn in my existing code?">Should I
|
||||
replace every occurence of <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">mem_fun</span><span class="special">[</span><span class="identifier">_ref</span><span class="special">]</span></code>
|
||||
with <code class="computeroutput"><span class="identifier">mem_fn</span></code> in my existing
|
||||
code?</a>
|
||||
</h3></div></div></div>
|
||||
<p>
|
||||
No, unless you have good reasons to do so. <code class="computeroutput"><span class="identifier">mem_fn</span></code>
|
||||
is not 100% compatible with the standard adaptors, although it comes pretty
|
||||
close. In particular, <code class="computeroutput"><span class="identifier">mem_fn</span></code>
|
||||
does not return objects of type <code class="computeroutput"><span class="identifier">std</span><span class="special">::[</span><span class="identifier">const_</span><span class="special">]</span><span class="identifier">mem_fun</span><span class="special">[</span><span class="number">1</span><span class="special">][</span><span class="identifier">_ref</span><span class="special">]</span><span class="identifier">_t</span></code>,
|
||||
as the standard adaptors do, and it is not possible to fully describe the
|
||||
type of the first argument using the standard <code class="computeroutput"><span class="identifier">argument_type</span></code>
|
||||
and <code class="computeroutput"><span class="identifier">first_argument_type</span></code> nested
|
||||
typedefs. Libraries that need adaptable function objects in order to function
|
||||
might not like <code class="computeroutput"><span class="identifier">mem_fn</span></code>.
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="mem_fn.faq.does_mem_fn_work_with_com_method"></a><a class="link" href="mem_fn.html#mem_fn.faq.does_mem_fn_work_with_com_method" title="Does mem_fn work with COM methods?">Does <code class="computeroutput"><span class="identifier">mem_fn</span></code> work with COM methods?</a>
|
||||
</h3></div></div></div>
|
||||
<p>
|
||||
Yes, if you <a class="link" href="mem_fn.html#mem_fn.implementation.stdcall" title="__stdcall, __cdecl, and __fastcall Support">`#define BOOST_MEM_FN_ENABLE_STDCALL</a>.
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="mem_fn.faq.why_isn_t_boost_mem_fn_enable_st"></a><a class="link" href="mem_fn.html#mem_fn.faq.why_isn_t_boost_mem_fn_enable_st" title="Why isn't BOOST_MEM_FN_ENABLE_STDCALL defined automatically?">Why isn't
|
||||
<code class="computeroutput"><span class="identifier">BOOST_MEM_FN_ENABLE_STDCALL</span></code>
|
||||
defined automatically?</a>
|
||||
</h3></div></div></div>
|
||||
<p>
|
||||
Non-portable extensions, in general, should default to off to prevent vendor
|
||||
lock-in. Had <code class="computeroutput"><span class="identifier">BOOST_MEM_FN_ENABLE_STDCALL</span></code>
|
||||
been defined automatically, you could have accidentally taken advantage of
|
||||
it without realizing that your code is, perhaps, no longer portable. In addition,
|
||||
it is possible for the default calling convention to be <code class="computeroutput"><span class="identifier">__stdcall</span></code>,
|
||||
in which case enabling <code class="computeroutput"><span class="identifier">__stdcall</span></code>
|
||||
support will result in duplicate definitions.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="mem_fn.interface"></a><a class="link" href="mem_fn.html#mem_fn.interface" title="Interface">Interface</a>
|
||||
</h2></div></div></div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="mem_fn.interface.synopsys"></a><a class="link" href="mem_fn.html#mem_fn.interface.synopsys" title="Synopsis">Synopsis</a>
|
||||
</h3></div></div></div>
|
||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="identifier">T</span> <span class="special">*</span> <a class="link" href="mem_fn.html#get_pointer_1"><code class="computeroutput"><span class="identifier">get_pointer</span></code></a><span class="special">(</span><span class="identifier">T</span> <span class="special">*</span> <span class="identifier">p</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="emphasis"><em>unspecified-1</em></span> <a class="link" href="mem_fn.html#mem_fn_1"><code class="computeroutput"><span class="identifier">mem_fn</span></code></a><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">pmf</span><span class="special">)</span> <span class="special">());</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="emphasis"><em>unspecified-2</em></span> <a class="link" href="mem_fn.html#mem_fn_2"><code class="computeroutput"><span class="identifier">mem_fn</span></code></a><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">pmf</span><span class="special">)</span> <span class="special">()</span> <span class="keyword">const</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="emphasis"><em>unspecified-2-1</em></span> <a class="link" href="mem_fn.html#mem_fn_2_1"><code class="computeroutput"><span class="identifier">mem_fn</span></code></a><span class="special">(</span><span class="identifier">R</span> <span class="identifier">T</span><span class="special">::*</span><span class="identifier">pm</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">></span> <span class="emphasis"><em>unspecified-3</em></span> <a class="link" href="mem_fn.html#mem_fn_3"><code class="computeroutput"><span class="identifier">mem_fn</span></code></a><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">pmf</span><span class="special">)</span> <span class="special">(</span><span class="identifier">A1</span><span class="special">));</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">></span> <span class="emphasis"><em>unspecified-4</em></span> <a class="link" href="mem_fn.html#mem_fn_4"><code class="computeroutput"><span class="identifier">mem_fn</span></code></a><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">pmf</span><span class="special">)</span> <span class="special">(</span><span class="identifier">A1</span><span class="special">)</span> <span class="keyword">const</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">></span> <span class="emphasis"><em>unspecified-5</em></span> <a class="link" href="mem_fn.html#mem_fn_5"><code class="computeroutput"><span class="identifier">mem_fn</span></code></a><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">pmf</span><span class="special">)</span> <span class="special">(</span><span class="identifier">A1</span><span class="special">,</span> <span class="identifier">A2</span><span class="special">));</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">></span> <span class="emphasis"><em>unspecified-6</em></span> <a class="link" href="mem_fn.html#mem_fn_6"><code class="computeroutput"><span class="identifier">mem_fn</span></code></a><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">pmf</span><span class="special">)</span> <span class="special">(</span><span class="identifier">A1</span><span class="special">,</span> <span class="identifier">A2</span><span class="special">)</span> <span class="keyword">const</span><span class="special">);</span>
|
||||
|
||||
<span class="comment">// implementation defined number of additional overloads for more arguments</span>
|
||||
<span class="special">}</span>
|
||||
</pre>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="mem_fn.interface.common_requirements"></a><a class="link" href="mem_fn.html#mem_fn.interface.common_requirements" title="Common requirements">Common requirements</a>
|
||||
</h3></div></div></div>
|
||||
<p>
|
||||
All <span class="emphasis"><em>unspecified-N</em></span> types mentioned in the Synopsis are
|
||||
<span class="emphasis"><em>CopyConstructible</em></span> and <span class="emphasis"><em>Assignable</em></span>.
|
||||
Their copy constructors and assignment operators do not throw exceptions.
|
||||
<span class="emphasis"><em>unspecified-N</em></span><code class="computeroutput"><span class="special">::</span><span class="identifier">result_type</span></code> is defined as the return type
|
||||
of the member function pointer passed as an argument to <code class="computeroutput"><span class="identifier">mem_fn</span></code>
|
||||
(<code class="computeroutput"><span class="identifier">R</span></code> in the Synopsis.) <span class="emphasis"><em>unspecified-2-1</em></span><code class="computeroutput"><span class="special">::</span><span class="identifier">result_type</span></code>
|
||||
is defined as <code class="computeroutput"><span class="identifier">R</span></code>.
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="mem_fn.interface.get_pointer"></a><a class="link" href="mem_fn.html#mem_fn.interface.get_pointer" title="get_pointer"><code class="computeroutput"><span class="identifier">get_pointer</span></code></a>
|
||||
</h3></div></div></div>
|
||||
<a name="get_pointer_1"></a><pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="identifier">T</span> <span class="special">*</span> <span class="identifier">get_pointer</span><span class="special">(</span><span class="identifier">T</span> <span class="special">*</span> <span class="identifier">p</span><span class="special">)</span>
|
||||
</pre>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||
<li class="listitem">
|
||||
<span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">p</span></code>.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<span class="emphasis"><em>Throws:</em></span> Nothing.
|
||||
</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="mem_fn.interface.mem_fn"></a><a class="link" href="mem_fn.html#mem_fn.interface.mem_fn" title="mem_fn"><code class="computeroutput"><span class="identifier">mem_fn</span></code></a>
|
||||
</h3></div></div></div>
|
||||
<a name="mem_fn_1"></a><pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="emphasis"><em>unspecified-1</em></span> <span class="identifier">mem_fn</span><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">pmf</span><span class="special">)</span> <span class="special">())</span>
|
||||
</pre>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||
<li class="listitem">
|
||||
<span class="emphasis"><em>Returns:</em></span> a function object ϝ such that the
|
||||
expression ϝ<code class="computeroutput"><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> is equivalent to <code class="computeroutput"><span class="special">(</span><span class="identifier">t</span><span class="special">.*</span><span class="identifier">pmf</span><span class="special">)()</span></code>
|
||||
when <code class="computeroutput"><span class="identifier">t</span></code> is an l-value
|
||||
of type <code class="computeroutput"><span class="identifier">T</span></code> or derived,
|
||||
<code class="computeroutput"><span class="special">(</span><span class="identifier">get_pointer</span><span class="special">(</span><span class="identifier">t</span><span class="special">)->*</span><span class="identifier">pmf</span><span class="special">)()</span></code> otherwise.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<span class="emphasis"><em>Throws:</em></span> Nothing.
|
||||
</li>
|
||||
</ul></div>
|
||||
<a name="mem_fn_2"></a><pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="emphasis"><em>unspecified-2</em></span> <span class="identifier">mem_fn</span><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">pmf</span><span class="special">)</span> <span class="special">()</span> <span class="keyword">const</span><span class="special">)</span>
|
||||
</pre>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||
<li class="listitem">
|
||||
<span class="emphasis"><em>Returns:</em></span> a function object ϝ such that the
|
||||
expression ϝ<code class="computeroutput"><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> is equivalent to <code class="computeroutput"><span class="special">(</span><span class="identifier">t</span><span class="special">.*</span><span class="identifier">pmf</span><span class="special">)()</span></code>
|
||||
when <code class="computeroutput"><span class="identifier">t</span></code> is of type <code class="computeroutput"><span class="identifier">T</span></code> <span class="emphasis"><em>[</em></span><code class="computeroutput"><span class="keyword">const</span></code><span class="emphasis"><em>]</em></span> or derived,
|
||||
<code class="computeroutput"><span class="special">(</span><span class="identifier">get_pointer</span><span class="special">(</span><span class="identifier">t</span><span class="special">)->*</span><span class="identifier">pmf</span><span class="special">)()</span></code> otherwise.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<span class="emphasis"><em>Throws:</em></span> Nothing.
|
||||
</li>
|
||||
</ul></div>
|
||||
<a name="mem_fn_2_1"></a><pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="emphasis"><em>unspecified-2-1</em></span> <span class="identifier">mem_fn</span><span class="special">(</span><span class="identifier">R</span> <span class="identifier">T</span><span class="special">::*</span><span class="identifier">pm</span><span class="special">)</span>
|
||||
</pre>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||
<li class="listitem">
|
||||
<span class="emphasis"><em>Returns:</em></span> a function object ϝ such that the
|
||||
expression ϝ<code class="computeroutput"><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> is equivalent to <code class="computeroutput"><span class="identifier">t</span><span class="special">.*</span><span class="identifier">pm</span></code>
|
||||
when <code class="computeroutput"><span class="identifier">t</span></code> is of type <code class="computeroutput"><span class="identifier">T</span></code> <span class="emphasis"><em>[</em></span><code class="computeroutput"><span class="keyword">const</span></code><span class="emphasis"><em>]</em></span> or derived,
|
||||
<code class="computeroutput"><span class="identifier">get_pointer</span><span class="special">(</span><span class="identifier">t</span><span class="special">)->*</span><span class="identifier">pm</span></code> otherwise.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<span class="emphasis"><em>Throws:</em></span> Nothing.
|
||||
</li>
|
||||
</ul></div>
|
||||
<a name="mem_fn_3"></a><pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">></span> <span class="emphasis"><em>unspecified-3</em></span> <span class="identifier">mem_fn</span><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">pmf</span><span class="special">)</span> <span class="special">(</span><span class="identifier">A1</span><span class="special">))</span>
|
||||
</pre>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||
<li class="listitem">
|
||||
<span class="emphasis"><em>Returns:</em></span> a function object ϝ such that the
|
||||
expression ϝ<code class="computeroutput"><span class="special">(</span><span class="identifier">t</span><span class="special">,</span> <span class="identifier">a1</span><span class="special">)</span></code> is equivalent to <code class="computeroutput"><span class="special">(</span><span class="identifier">t</span><span class="special">.*</span><span class="identifier">pmf</span><span class="special">)(</span><span class="identifier">a1</span><span class="special">)</span></code>
|
||||
when <code class="computeroutput"><span class="identifier">t</span></code> is an l-value
|
||||
of type <code class="computeroutput"><span class="identifier">T</span></code> or derived,
|
||||
<code class="computeroutput"><span class="special">(</span><span class="identifier">get_pointer</span><span class="special">(</span><span class="identifier">t</span><span class="special">)->*</span><span class="identifier">pmf</span><span class="special">)(</span><span class="identifier">a1</span><span class="special">)</span></code> otherwise.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<span class="emphasis"><em>Throws:</em></span> Nothing.
|
||||
</li>
|
||||
</ul></div>
|
||||
<a name="mem_fn_4"></a><pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">></span> <span class="emphasis"><em>unspecified-4</em></span> <span class="identifier">mem_fn</span><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">pmf</span><span class="special">)</span> <span class="special">(</span><span class="identifier">A1</span><span class="special">)</span> <span class="keyword">const</span><span class="special">)</span>
|
||||
</pre>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||
<li class="listitem">
|
||||
<span class="emphasis"><em>Returns:</em></span> a function object ϝ such that the
|
||||
expression ϝ<code class="computeroutput"><span class="special">(</span><span class="identifier">t</span><span class="special">,</span> <span class="identifier">a1</span><span class="special">)</span></code> is equivalent to <code class="computeroutput"><span class="special">(</span><span class="identifier">t</span><span class="special">.*</span><span class="identifier">pmf</span><span class="special">)(</span><span class="identifier">a1</span><span class="special">)</span></code>
|
||||
when <code class="computeroutput"><span class="identifier">t</span></code> is of type <code class="computeroutput"><span class="identifier">T</span></code> <span class="emphasis"><em>[</em></span><code class="computeroutput"><span class="keyword">const</span></code><span class="emphasis"><em>]</em></span> or derived,
|
||||
<code class="computeroutput"><span class="special">(</span><span class="identifier">get_pointer</span><span class="special">(</span><span class="identifier">t</span><span class="special">)->*</span><span class="identifier">pmf</span><span class="special">)(</span><span class="identifier">a1</span><span class="special">)</span></code> otherwise.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<span class="emphasis"><em>Throws:</em></span> Nothing.
|
||||
</li>
|
||||
</ul></div>
|
||||
<a name="mem_fn_5"></a><pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">></span> <span class="emphasis"><em>unspecified-5</em></span> <span class="identifier">mem_fn</span><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">pmf</span><span class="special">)</span> <span class="special">(</span><span class="identifier">A1</span><span class="special">,</span> <span class="identifier">A2</span><span class="special">))</span>
|
||||
</pre>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||
<li class="listitem">
|
||||
<span class="emphasis"><em>Returns:</em></span> a function object ϝ such that the
|
||||
expression ϝ<code class="computeroutput"><span class="special">(</span><span class="identifier">t</span><span class="special">,</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">)</span></code> is equivalent to <code class="computeroutput"><span class="special">(</span><span class="identifier">t</span><span class="special">.*</span><span class="identifier">pmf</span><span class="special">)(</span><span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">)</span></code>
|
||||
when <code class="computeroutput"><span class="identifier">t</span></code> is an l-value
|
||||
of type <code class="computeroutput"><span class="identifier">T</span></code> or derived,
|
||||
<code class="computeroutput"><span class="special">(</span><span class="identifier">get_pointer</span><span class="special">(</span><span class="identifier">t</span><span class="special">)->*</span><span class="identifier">pmf</span><span class="special">)(</span><span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">)</span></code> otherwise.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<span class="emphasis"><em>Throws:</em></span> Nothing.
|
||||
</li>
|
||||
</ul></div>
|
||||
<a name="mem_fn_6"></a><pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">></span> <span class="emphasis"><em>unspecified-6</em></span> <span class="identifier">mem_fn</span><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">pmf</span><span class="special">)</span> <span class="special">(</span><span class="identifier">A1</span><span class="special">,</span> <span class="identifier">A2</span><span class="special">)</span> <span class="keyword">const</span><span class="special">)</span>
|
||||
</pre>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||
<li class="listitem">
|
||||
<span class="emphasis"><em>Returns:</em></span> a function object ϝ such that the
|
||||
expression ϝ<code class="computeroutput"><span class="special">(</span><span class="identifier">t</span><span class="special">,</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">)</span></code> is equivalent to <code class="computeroutput"><span class="special">(</span><span class="identifier">t</span><span class="special">.*</span><span class="identifier">pmf</span><span class="special">)(</span><span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">)</span></code>
|
||||
when <code class="computeroutput"><span class="identifier">t</span></code> is of type <code class="computeroutput"><span class="identifier">T</span></code> <span class="emphasis"><em>[</em></span><code class="computeroutput"><span class="keyword">const</span></code><span class="emphasis"><em>]</em></span> or derived,
|
||||
<code class="computeroutput"><span class="special">(</span><span class="identifier">get_pointer</span><span class="special">(</span><span class="identifier">t</span><span class="special">)->*</span><span class="identifier">pmf</span><span class="special">)(</span><span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">)</span></code> otherwise.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<span class="emphasis"><em>Throws:</em></span> Nothing.
|
||||
</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="mem_fn.implementation"></a><a class="link" href="mem_fn.html#mem_fn.implementation" title="Implementation">Implementation</a>
|
||||
</h2></div></div></div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="mem_fn.implementation.files"></a><a class="link" href="mem_fn.html#mem_fn.implementation.files" title="Files">Files</a>
|
||||
</h3></div></div></div>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||
<li class="listitem">
|
||||
<a href="../../../../boost/mem_fn.hpp" target="_top">boost/mem_fn.hpp</a> (main
|
||||
header)
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<a href="../../../../boost/bind/mem_fn_cc.hpp" target="_top">boost/bind/mem_fn_cc.hpp</a>
|
||||
(used by <code class="computeroutput"><span class="identifier">mem_fn</span><span class="special">.</span><span class="identifier">hpp</span></code>, do not include directly)
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<a href="../../../../boost/bind/mem_fn_vw.hpp" target="_top">boost/bind/mem_fn_vw.hpp</a>
|
||||
(used by <code class="computeroutput"><span class="identifier">mem_fn</span><span class="special">.</span><span class="identifier">hpp</span></code>, do not include directly)
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<a href="../../../../boost/bind/mem_fn_template.hpp" target="_top">boost/bind/mem_fn_template.hpp</a>
|
||||
(used by <code class="computeroutput"><span class="identifier">mem_fn</span><span class="special">.</span><span class="identifier">hpp</span></code>, do not include directly)
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<a href="../../test/mem_fn_test.cpp" target="_top">libs/bind/test/mem_fn_test.cpp</a>
|
||||
(test)
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<a href="../../test/mem_fn_derived_test.cpp" target="_top">libs/bind/test/mem_fn_derived_test.cpp</a>
|
||||
(test with derived objects)
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<a href="../../test/mem_fn_fastcall_test.cpp" target="_top">libs/bind/test/mem_fn_fastcall_test.cpp</a>
|
||||
(test for <code class="computeroutput"><span class="identifier">__fastcall</span></code>)
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<a href="../../test/mem_fn_stdcall_test.cpp" target="_top">libs/bind/test/mem_fn_stdcall_test.cpp</a>
|
||||
(test for <code class="computeroutput"><span class="identifier">__stdcall</span></code>)
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<a href="../../test/mem_fn_void_test.cpp" target="_top">libs/bind/test/mem_fn_void_test.cpp</a>
|
||||
(test for <code class="computeroutput"><span class="keyword">void</span></code> returns)
|
||||
</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="mem_fn.implementation.dependencies"></a><a class="link" href="mem_fn.html#mem_fn.implementation.dependencies" title="Dependencies">Dependencies</a>
|
||||
</h3></div></div></div>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
|
||||
<a href="../../../../libs/config/config.htm" target="_top">Boost.Config</a>
|
||||
</li></ul></div>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="mem_fn.implementation.number_of_arguments"></a><a class="link" href="mem_fn.html#mem_fn.implementation.number_of_arguments" title="Number of Arguments">Number of
|
||||
Arguments</a>
|
||||
</h3></div></div></div>
|
||||
<p>
|
||||
This implementation supports member functions with up to eight arguments.
|
||||
This is not an inherent limitation of the design, but an implementation detail.
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="mem_fn.implementation.stdcall"></a><a class="link" href="mem_fn.html#mem_fn.implementation.stdcall" title="__stdcall, __cdecl, and __fastcall Support"><code class="computeroutput"><span class="identifier">__stdcall</span></code>,
|
||||
<code class="computeroutput"><span class="identifier">__cdecl</span></code>, and <code class="computeroutput"><span class="identifier">__fastcall</span></code> Support</a>
|
||||
</h3></div></div></div>
|
||||
<p>
|
||||
Some platforms allow several types of member functions that differ by their
|
||||
calling convention (the rules by which the function is invoked: how are arguments
|
||||
passed, how is the return value handled, and who cleans up the stack - if
|
||||
any.)
|
||||
</p>
|
||||
<p>
|
||||
For example, Windows API functions and COM interface member functions use
|
||||
a calling convention known as <code class="computeroutput"><span class="identifier">__stdcall</span></code>.
|
||||
Borland VCL components use <code class="computeroutput"><span class="identifier">__fastcall</span></code>.
|
||||
UDK, the component model of OpenOffice.org, uses <code class="computeroutput"><span class="identifier">__cdecl</span></code>.
|
||||
</p>
|
||||
<p>
|
||||
To use <code class="computeroutput"><span class="identifier">mem_fn</span></code> with <code class="computeroutput"><span class="identifier">__stdcall</span></code> member functions, <code class="computeroutput"><span class="preprocessor">#define</span></code> the macro <code class="computeroutput"><span class="identifier">BOOST_MEM_FN_ENABLE_STDCALL</span></code>
|
||||
before including <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mem_fn</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>.
|
||||
</p>
|
||||
<p>
|
||||
To use <code class="computeroutput"><span class="identifier">mem_fn</span></code> with <code class="computeroutput"><span class="identifier">__fastcall</span></code> member functions, <code class="computeroutput"><span class="preprocessor">#define</span></code> the macro <code class="computeroutput"><span class="identifier">BOOST_MEM_FN_ENABLE_FASTCALL</span></code>
|
||||
before including <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mem_fn</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>.
|
||||
</p>
|
||||
<p>
|
||||
To use <code class="computeroutput"><span class="identifier">mem_fn</span></code> with <code class="computeroutput"><span class="identifier">__cdecl</span></code> member functions, <code class="computeroutput"><span class="preprocessor">#define</span></code> the macro <code class="computeroutput"><span class="identifier">BOOST_MEM_FN_ENABLE_CDECL</span></code>
|
||||
before including <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mem_fn</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>.
|
||||
</p>
|
||||
<p>
|
||||
<span class="bold"><strong>It is best to define these macros in the project options,
|
||||
via <code class="computeroutput"><span class="special">-</span><span class="identifier">D</span></code>
|
||||
on the command line, or as the first line in the translation unit (.cpp file)
|
||||
where <code class="computeroutput"><span class="identifier">mem_fn</span></code> is used.</strong></span>
|
||||
Not following this rule can lead to obscure errors when a header includes
|
||||
<code class="computeroutput"><span class="identifier">mem_fn</span><span class="special">.</span><span class="identifier">hpp</span></code> before the macro has been defined.
|
||||
</p>
|
||||
<p>
|
||||
<span class="emphasis"><em>[Note:</em></span> this is a non-portable extension. It is not part
|
||||
of the interface.<span class="emphasis"><em>]</em></span>
|
||||
</p>
|
||||
<p>
|
||||
<span class="emphasis"><em>[Note:</em></span> Some compilers provide only minimal support for
|
||||
the <code class="computeroutput"><span class="identifier">__stdcall</span></code> keyword.<span class="emphasis"><em>]</em></span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="mem_fn.acknowledgements"></a><a class="link" href="mem_fn.html#mem_fn.acknowledgements" title="Acknowledgements">Acknowledgements</a>
|
||||
</h2></div></div></div>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||
<li class="listitem">
|
||||
Rene Jager's initial suggestion of using traits classes to make <code class="computeroutput"><span class="identifier">mem_fn</span></code> adapt to user-defined smart pointers
|
||||
inspired the <code class="computeroutput"><span class="identifier">get_pointer</span></code>-based
|
||||
design.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
Numerous improvements were suggested during the formal review period by
|
||||
Richard Crossley, Jens Maurer, Ed Brey, and others. Review manager was
|
||||
Darin Adler.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
Steve Anichini pointed out that COM interfaces use <code class="computeroutput"><span class="identifier">__stdcall</span></code>.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
Dave Abrahams modified <code class="computeroutput"><span class="identifier">bind</span></code>
|
||||
and <code class="computeroutput"><span class="identifier">mem_fn</span></code> to support
|
||||
<code class="computeroutput"><span class="keyword">void</span></code> returns on deficient
|
||||
compilers.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
Daniel Boelzle pointed out that UDK uses <code class="computeroutput"><span class="identifier">__cdecl</span></code>.
|
||||
</li>
|
||||
</ul></div>
|
||||
<p>
|
||||
This documentation was ported to Quickbook by Agustín Bergé.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"><p><small>Last revised: June 06, 2015 at 16:07:47 GMT</small></p></td>
|
||||
<td align="right"><div class="copyright-footer"></div></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -11,10 +11,10 @@
|
||||
|
||||
[section Files]
|
||||
|
||||
* [@../../include/boost/mem_fn.hpp boost/mem_fn.hpp] (main header)
|
||||
* [@../../include/boost/bind/mem_fn_cc.hpp boost/bind/mem_fn_cc.hpp] (used by `mem_fn.hpp`, do not include directly)
|
||||
* [@../../include/boost/bind/mem_fn_vw.hpp boost/bind/mem_fn_vw.hpp] (used by `mem_fn.hpp`, do not include directly)
|
||||
* [@../../include/boost/bind/mem_fn_template.hpp boost/bind/mem_fn_template.hpp] (used by `mem_fn.hpp`, do not include directly)
|
||||
* [@../../../../boost/mem_fn.hpp boost/mem_fn.hpp] (main header)
|
||||
* [@../../../../boost/bind/mem_fn_cc.hpp boost/bind/mem_fn_cc.hpp] (used by `mem_fn.hpp`, do not include directly)
|
||||
* [@../../../../boost/bind/mem_fn_vw.hpp boost/bind/mem_fn_vw.hpp] (used by `mem_fn.hpp`, do not include directly)
|
||||
* [@../../../../boost/bind/mem_fn_template.hpp boost/bind/mem_fn_template.hpp] (used by `mem_fn.hpp`, do not include directly)
|
||||
* [@../../test/mem_fn_test.cpp libs/bind/test/mem_fn_test.cpp] (test)
|
||||
* [@../../test/mem_fn_derived_test.cpp libs/bind/test/mem_fn_derived_test.cpp] (test with derived objects)
|
||||
* [@../../test/mem_fn_fastcall_test.cpp libs/bind/test/mem_fn_fastcall_test.cpp] (test for `__fastcall`)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
//
|
||||
// bind.hpp - binds function objects to arguments
|
||||
//
|
||||
// Copyright (c) 2009 Peter Dimov
|
||||
// Copyright (c) 2009, 2015 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
@@ -21,4 +21,21 @@
|
||||
|
||||
#include <boost/bind/bind.hpp>
|
||||
|
||||
#ifndef BOOST_BIND_NO_PLACEHOLDERS
|
||||
|
||||
#if defined(BOOST_CLANG)
|
||||
# pragma clang diagnostic push
|
||||
# if __has_warning("-Wheader-hygiene")
|
||||
# pragma clang diagnostic ignored "-Wheader-hygiene"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
using namespace boost::placeholders;
|
||||
|
||||
#if defined(BOOST_CLANG)
|
||||
# pragma clang diagnostic pop
|
||||
#endif
|
||||
|
||||
#endif // #ifndef BOOST_BIND_NO_PLACEHOLDERS
|
||||
|
||||
#endif // #ifndef BOOST_BIND_HPP_INCLUDED
|
||||
|
||||
@@ -28,17 +28,17 @@ namespace boost
|
||||
|
||||
template< int I > struct arg
|
||||
{
|
||||
arg()
|
||||
BOOST_CONSTEXPR arg()
|
||||
{
|
||||
}
|
||||
|
||||
template< class T > arg( T const & /* t */ )
|
||||
template< class T > BOOST_CONSTEXPR arg( T const & /* t */ )
|
||||
{
|
||||
BOOST_STATIC_ASSERT( I == is_placeholder<T>::value );
|
||||
}
|
||||
};
|
||||
|
||||
template< int I > bool operator==( arg<I> const &, arg<I> const & )
|
||||
template< int I > BOOST_CONSTEXPR bool operator==( arg<I> const &, arg<I> const & )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -32,6 +32,10 @@
|
||||
#include <boost/core/enable_if.hpp>
|
||||
#include <boost/core/is_same.hpp>
|
||||
|
||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
|
||||
#include <utility> // std::forward
|
||||
#endif
|
||||
|
||||
// Borland-specific bug, visit_each() silently fails to produce code
|
||||
|
||||
#if defined(__BORLANDC__)
|
||||
@@ -863,14 +867,337 @@ public:
|
||||
|
||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
|
||||
|
||||
template< class A > struct list_add_cref
|
||||
template< class A1 > class rrlist1
|
||||
{
|
||||
typedef A const & type;
|
||||
private:
|
||||
|
||||
A1 & a1_; // not A1&& because of msvc-10.0
|
||||
|
||||
public:
|
||||
|
||||
explicit rrlist1( A1 & a1 ): a1_( a1 ) {}
|
||||
|
||||
A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); } // not static_cast because of g++ 4.9
|
||||
|
||||
A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
|
||||
|
||||
template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
|
||||
};
|
||||
|
||||
template< class A > struct list_add_cref< A& >
|
||||
template< class A1, class A2 > class rrlist2
|
||||
{
|
||||
typedef A & type;
|
||||
private:
|
||||
|
||||
A1 & a1_;
|
||||
A2 & a2_;
|
||||
|
||||
public:
|
||||
|
||||
rrlist2( A1 & a1, A2 & a2 ): a1_( a1 ), a2_( a2 ) {}
|
||||
|
||||
A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
|
||||
A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
|
||||
|
||||
A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
|
||||
A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
|
||||
|
||||
template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
|
||||
};
|
||||
|
||||
template< class A1, class A2, class A3 > class rrlist3
|
||||
{
|
||||
private:
|
||||
|
||||
A1 & a1_;
|
||||
A2 & a2_;
|
||||
A3 & a3_;
|
||||
|
||||
public:
|
||||
|
||||
rrlist3( A1 & a1, A2 & a2, A3 & a3 ): a1_( a1 ), a2_( a2 ), a3_( a3 ) {}
|
||||
|
||||
A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
|
||||
A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
|
||||
A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
|
||||
|
||||
A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
|
||||
A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
|
||||
A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
|
||||
|
||||
template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
|
||||
};
|
||||
|
||||
template< class A1, class A2, class A3, class A4 > class rrlist4
|
||||
{
|
||||
private:
|
||||
|
||||
A1 & a1_;
|
||||
A2 & a2_;
|
||||
A3 & a3_;
|
||||
A4 & a4_;
|
||||
|
||||
public:
|
||||
|
||||
rrlist4( A1 & a1, A2 & a2, A3 & a3, A4 & a4 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ) {}
|
||||
|
||||
A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
|
||||
A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
|
||||
A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
|
||||
A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
|
||||
|
||||
A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
|
||||
A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
|
||||
A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
|
||||
A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
|
||||
|
||||
template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
|
||||
};
|
||||
|
||||
template< class A1, class A2, class A3, class A4, class A5 > class rrlist5
|
||||
{
|
||||
private:
|
||||
|
||||
A1 & a1_;
|
||||
A2 & a2_;
|
||||
A3 & a3_;
|
||||
A4 & a4_;
|
||||
A5 & a5_;
|
||||
|
||||
public:
|
||||
|
||||
rrlist5( A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ), a5_( a5 ) {}
|
||||
|
||||
A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
|
||||
A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
|
||||
A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
|
||||
A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
|
||||
A5 && operator[] (boost::arg<5>) const { return std::forward<A5>( a5_ ); }
|
||||
|
||||
A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
|
||||
A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
|
||||
A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
|
||||
A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
|
||||
A5 && operator[] (boost::arg<5> (*) ()) const { return std::forward<A5>( a5_ ); }
|
||||
|
||||
template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
|
||||
};
|
||||
|
||||
template< class A1, class A2, class A3, class A4, class A5, class A6 > class rrlist6
|
||||
{
|
||||
private:
|
||||
|
||||
A1 & a1_;
|
||||
A2 & a2_;
|
||||
A3 & a3_;
|
||||
A4 & a4_;
|
||||
A5 & a5_;
|
||||
A6 & a6_;
|
||||
|
||||
public:
|
||||
|
||||
rrlist6( A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ), a5_( a5 ), a6_( a6 ) {}
|
||||
|
||||
A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
|
||||
A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
|
||||
A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
|
||||
A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
|
||||
A5 && operator[] (boost::arg<5>) const { return std::forward<A5>( a5_ ); }
|
||||
A6 && operator[] (boost::arg<6>) const { return std::forward<A6>( a6_ ); }
|
||||
|
||||
A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
|
||||
A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
|
||||
A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
|
||||
A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
|
||||
A5 && operator[] (boost::arg<5> (*) ()) const { return std::forward<A5>( a5_ ); }
|
||||
A6 && operator[] (boost::arg<6> (*) ()) const { return std::forward<A6>( a6_ ); }
|
||||
|
||||
template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
|
||||
};
|
||||
|
||||
template< class A1, class A2, class A3, class A4, class A5, class A6, class A7 > class rrlist7
|
||||
{
|
||||
private:
|
||||
|
||||
A1 & a1_;
|
||||
A2 & a2_;
|
||||
A3 & a3_;
|
||||
A4 & a4_;
|
||||
A5 & a5_;
|
||||
A6 & a6_;
|
||||
A7 & a7_;
|
||||
|
||||
public:
|
||||
|
||||
rrlist7( A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ), a5_( a5 ), a6_( a6 ), a7_( a7 ) {}
|
||||
|
||||
A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
|
||||
A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
|
||||
A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
|
||||
A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
|
||||
A5 && operator[] (boost::arg<5>) const { return std::forward<A5>( a5_ ); }
|
||||
A6 && operator[] (boost::arg<6>) const { return std::forward<A6>( a6_ ); }
|
||||
A7 && operator[] (boost::arg<7>) const { return std::forward<A7>( a7_ ); }
|
||||
|
||||
A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
|
||||
A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
|
||||
A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
|
||||
A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
|
||||
A5 && operator[] (boost::arg<5> (*) ()) const { return std::forward<A5>( a5_ ); }
|
||||
A6 && operator[] (boost::arg<6> (*) ()) const { return std::forward<A6>( a6_ ); }
|
||||
A7 && operator[] (boost::arg<7> (*) ()) const { return std::forward<A7>( a7_ ); }
|
||||
|
||||
template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
|
||||
};
|
||||
|
||||
template< class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > class rrlist8
|
||||
{
|
||||
private:
|
||||
|
||||
A1 & a1_;
|
||||
A2 & a2_;
|
||||
A3 & a3_;
|
||||
A4 & a4_;
|
||||
A5 & a5_;
|
||||
A6 & a6_;
|
||||
A7 & a7_;
|
||||
A8 & a8_;
|
||||
|
||||
public:
|
||||
|
||||
rrlist8( A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ), a5_( a5 ), a6_( a6 ), a7_( a7 ), a8_( a8 ) {}
|
||||
|
||||
A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
|
||||
A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
|
||||
A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
|
||||
A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
|
||||
A5 && operator[] (boost::arg<5>) const { return std::forward<A5>( a5_ ); }
|
||||
A6 && operator[] (boost::arg<6>) const { return std::forward<A6>( a6_ ); }
|
||||
A7 && operator[] (boost::arg<7>) const { return std::forward<A7>( a7_ ); }
|
||||
A8 && operator[] (boost::arg<8>) const { return std::forward<A8>( a8_ ); }
|
||||
|
||||
A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
|
||||
A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
|
||||
A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
|
||||
A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
|
||||
A5 && operator[] (boost::arg<5> (*) ()) const { return std::forward<A5>( a5_ ); }
|
||||
A6 && operator[] (boost::arg<6> (*) ()) const { return std::forward<A6>( a6_ ); }
|
||||
A7 && operator[] (boost::arg<7> (*) ()) const { return std::forward<A7>( a7_ ); }
|
||||
A8 && operator[] (boost::arg<8> (*) ()) const { return std::forward<A8>( a8_ ); }
|
||||
|
||||
template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
|
||||
};
|
||||
|
||||
template< class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > class rrlist9
|
||||
{
|
||||
private:
|
||||
|
||||
A1 & a1_;
|
||||
A2 & a2_;
|
||||
A3 & a3_;
|
||||
A4 & a4_;
|
||||
A5 & a5_;
|
||||
A6 & a6_;
|
||||
A7 & a7_;
|
||||
A8 & a8_;
|
||||
A9 & a9_;
|
||||
|
||||
public:
|
||||
|
||||
rrlist9( A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ), a5_( a5 ), a6_( a6 ), a7_( a7 ), a8_( a8 ), a9_( a9 ) {}
|
||||
|
||||
A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
|
||||
A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
|
||||
A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
|
||||
A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
|
||||
A5 && operator[] (boost::arg<5>) const { return std::forward<A5>( a5_ ); }
|
||||
A6 && operator[] (boost::arg<6>) const { return std::forward<A6>( a6_ ); }
|
||||
A7 && operator[] (boost::arg<7>) const { return std::forward<A7>( a7_ ); }
|
||||
A8 && operator[] (boost::arg<8>) const { return std::forward<A8>( a8_ ); }
|
||||
A9 && operator[] (boost::arg<9>) const { return std::forward<A9>( a9_ ); }
|
||||
|
||||
A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
|
||||
A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
|
||||
A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
|
||||
A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
|
||||
A5 && operator[] (boost::arg<5> (*) ()) const { return std::forward<A5>( a5_ ); }
|
||||
A6 && operator[] (boost::arg<6> (*) ()) const { return std::forward<A6>( a6_ ); }
|
||||
A7 && operator[] (boost::arg<7> (*) ()) const { return std::forward<A7>( a7_ ); }
|
||||
A8 && operator[] (boost::arg<8> (*) ()) const { return std::forward<A8>( a8_ ); }
|
||||
A9 && operator[] (boost::arg<9> (*) ()) const { return std::forward<A9>( a9_ ); }
|
||||
|
||||
template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
|
||||
|
||||
template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
|
||||
|
||||
template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
|
||||
};
|
||||
|
||||
template<class R, class F, class L> class bind_t
|
||||
@@ -903,221 +1230,109 @@ public:
|
||||
|
||||
template<class A1> result_type operator()( A1 && a1 )
|
||||
{
|
||||
list1< typename list_add_cref<A1>::type > a( a1 );
|
||||
rrlist1< A1 > a( a1 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
template<class A1> result_type operator()( A1 && a1 ) const
|
||||
{
|
||||
list1< typename list_add_cref<A1>::type > a( a1 );
|
||||
rrlist1< A1 > a( a1 );
|
||||
return l_(type<result_type>(), f_, a, 0);
|
||||
}
|
||||
|
||||
template<class A1, class A2> result_type operator()( A1 && a1, A2 && a2 )
|
||||
{
|
||||
list2< typename list_add_cref<A1>::type, typename list_add_cref<A2>::type > a( a1, a2 );
|
||||
rrlist2< A1, A2 > a( a1, a2 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
template<class A1, class A2> result_type operator()( A1 && a1, A2 && a2 ) const
|
||||
{
|
||||
list2< typename list_add_cref<A1>::type, typename list_add_cref<A2>::type > a( a1, a2 );
|
||||
rrlist2< A1, A2 > a( a1, a2 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
template<class A1, class A2, class A3> result_type operator()( A1 && a1, A2 && a2, A3 && a3 )
|
||||
{
|
||||
list3<
|
||||
typename list_add_cref<A1>::type,
|
||||
typename list_add_cref<A2>::type,
|
||||
typename list_add_cref<A3>::type
|
||||
> a( a1, a2, a3 );
|
||||
|
||||
rrlist3< A1, A2, A3 > a( a1, a2, a3 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
template<class A1, class A2, class A3> result_type operator()( A1 && a1, A2 && a2, A3 && a3 ) const
|
||||
{
|
||||
list3<
|
||||
typename list_add_cref<A1>::type,
|
||||
typename list_add_cref<A2>::type,
|
||||
typename list_add_cref<A3>::type
|
||||
> a( a1, a2, a3 );
|
||||
|
||||
rrlist3< A1, A2, A3 > a( a1, a2, a3 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
template<class A1, class A2, class A3, class A4> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
|
||||
{
|
||||
list4<
|
||||
typename list_add_cref<A1>::type,
|
||||
typename list_add_cref<A2>::type,
|
||||
typename list_add_cref<A3>::type,
|
||||
typename list_add_cref<A4>::type
|
||||
> a( a1, a2, a3, a4 );
|
||||
|
||||
rrlist4< A1, A2, A3, A4 > a( a1, a2, a3, a4 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
template<class A1, class A2, class A3, class A4> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4 ) const
|
||||
{
|
||||
list4<
|
||||
typename list_add_cref<A1>::type,
|
||||
typename list_add_cref<A2>::type,
|
||||
typename list_add_cref<A3>::type,
|
||||
typename list_add_cref<A4>::type
|
||||
> a( a1, a2, a3, a4 );
|
||||
|
||||
rrlist4< A1, A2, A3, A4 > a( a1, a2, a3, a4 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
template<class A1, class A2, class A3, class A4, class A5> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
|
||||
{
|
||||
list5<
|
||||
typename list_add_cref<A1>::type,
|
||||
typename list_add_cref<A2>::type,
|
||||
typename list_add_cref<A3>::type,
|
||||
typename list_add_cref<A4>::type,
|
||||
typename list_add_cref<A5>::type
|
||||
> a( a1, a2, a3, a4, a5 );
|
||||
|
||||
rrlist5< A1, A2, A3, A4, A5 > a( a1, a2, a3, a4, a5 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
template<class A1, class A2, class A3, class A4, class A5> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 ) const
|
||||
{
|
||||
list5<
|
||||
typename list_add_cref<A1>::type,
|
||||
typename list_add_cref<A2>::type,
|
||||
typename list_add_cref<A3>::type,
|
||||
typename list_add_cref<A4>::type,
|
||||
typename list_add_cref<A5>::type
|
||||
> a( a1, a2, a3, a4, a5 );
|
||||
|
||||
rrlist5< A1, A2, A3, A4, A5 > a( a1, a2, a3, a4, a5 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 )
|
||||
{
|
||||
list6<
|
||||
typename list_add_cref<A1>::type,
|
||||
typename list_add_cref<A2>::type,
|
||||
typename list_add_cref<A3>::type,
|
||||
typename list_add_cref<A4>::type,
|
||||
typename list_add_cref<A5>::type,
|
||||
typename list_add_cref<A6>::type
|
||||
> a( a1, a2, a3, a4, a5, a6 );
|
||||
|
||||
rrlist6< A1, A2, A3, A4, A5, A6 > a( a1, a2, a3, a4, a5, a6 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 ) const
|
||||
{
|
||||
list6<
|
||||
typename list_add_cref<A1>::type,
|
||||
typename list_add_cref<A2>::type,
|
||||
typename list_add_cref<A3>::type,
|
||||
typename list_add_cref<A4>::type,
|
||||
typename list_add_cref<A5>::type,
|
||||
typename list_add_cref<A6>::type
|
||||
> a( a1, a2, a3, a4, a5, a6 );
|
||||
|
||||
rrlist6< A1, A2, A3, A4, A5, A6 > a( a1, a2, a3, a4, a5, a6 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 )
|
||||
{
|
||||
list7<
|
||||
typename list_add_cref<A1>::type,
|
||||
typename list_add_cref<A2>::type,
|
||||
typename list_add_cref<A3>::type,
|
||||
typename list_add_cref<A4>::type,
|
||||
typename list_add_cref<A5>::type,
|
||||
typename list_add_cref<A6>::type,
|
||||
typename list_add_cref<A7>::type
|
||||
> a( a1, a2, a3, a4, a5, a6, a7 );
|
||||
|
||||
rrlist7< A1, A2, A3, A4, A5, A6, A7 > a( a1, a2, a3, a4, a5, a6, a7 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 ) const
|
||||
{
|
||||
list7<
|
||||
typename list_add_cref<A1>::type,
|
||||
typename list_add_cref<A2>::type,
|
||||
typename list_add_cref<A3>::type,
|
||||
typename list_add_cref<A4>::type,
|
||||
typename list_add_cref<A5>::type,
|
||||
typename list_add_cref<A6>::type,
|
||||
typename list_add_cref<A7>::type
|
||||
> a( a1, a2, a3, a4, a5, a6, a7 );
|
||||
|
||||
rrlist7< A1, A2, A3, A4, A5, A6, A7 > a( a1, a2, a3, a4, a5, a6, a7 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 )
|
||||
{
|
||||
list8<
|
||||
typename list_add_cref<A1>::type,
|
||||
typename list_add_cref<A2>::type,
|
||||
typename list_add_cref<A3>::type,
|
||||
typename list_add_cref<A4>::type,
|
||||
typename list_add_cref<A5>::type,
|
||||
typename list_add_cref<A6>::type,
|
||||
typename list_add_cref<A7>::type,
|
||||
typename list_add_cref<A8>::type
|
||||
> a( a1, a2, a3, a4, a5, a6, a7, a8 );
|
||||
|
||||
rrlist8< A1, A2, A3, A4, A5, A6, A7, A8 > a( a1, a2, a3, a4, a5, a6, a7, a8 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 ) const
|
||||
{
|
||||
list8<
|
||||
typename list_add_cref<A1>::type,
|
||||
typename list_add_cref<A2>::type,
|
||||
typename list_add_cref<A3>::type,
|
||||
typename list_add_cref<A4>::type,
|
||||
typename list_add_cref<A5>::type,
|
||||
typename list_add_cref<A6>::type,
|
||||
typename list_add_cref<A7>::type,
|
||||
typename list_add_cref<A8>::type
|
||||
> a( a1, a2, a3, a4, a5, a6, a7, a8 );
|
||||
|
||||
rrlist8< A1, A2, A3, A4, A5, A6, A7, A8 > a( a1, a2, a3, a4, a5, a6, a7, a8 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 )
|
||||
{
|
||||
list9<
|
||||
typename list_add_cref<A1>::type,
|
||||
typename list_add_cref<A2>::type,
|
||||
typename list_add_cref<A3>::type,
|
||||
typename list_add_cref<A4>::type,
|
||||
typename list_add_cref<A5>::type,
|
||||
typename list_add_cref<A6>::type,
|
||||
typename list_add_cref<A7>::type,
|
||||
typename list_add_cref<A8>::type,
|
||||
typename list_add_cref<A9>::type
|
||||
> a( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
|
||||
|
||||
rrlist9< A1, A2, A3, A4, A5, A6, A7, A8, A9 > a( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 ) const
|
||||
{
|
||||
list9<
|
||||
typename list_add_cref<A1>::type,
|
||||
typename list_add_cref<A2>::type,
|
||||
typename list_add_cref<A3>::type,
|
||||
typename list_add_cref<A4>::type,
|
||||
typename list_add_cref<A5>::type,
|
||||
typename list_add_cref<A6>::type,
|
||||
typename list_add_cref<A7>::type,
|
||||
typename list_add_cref<A8>::type,
|
||||
typename list_add_cref<A9>::type
|
||||
> a( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
|
||||
|
||||
rrlist9< A1, A2, A3, A4, A5, A6, A7, A8, A9 > a( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
|
||||
return l_( type<result_type>(), f_, a, 0 );
|
||||
}
|
||||
|
||||
|
||||
@@ -11,10 +11,11 @@
|
||||
// bind/placeholders.hpp - _N definitions
|
||||
//
|
||||
// Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
|
||||
// Copyright 2015 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See
|
||||
// accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
//
|
||||
// See http://www.boost.org/libs/bind/bind.html for documentation.
|
||||
//
|
||||
@@ -22,48 +23,40 @@
|
||||
#include <boost/bind/arg.hpp>
|
||||
#include <boost/config.hpp>
|
||||
|
||||
namespace
|
||||
namespace boost
|
||||
{
|
||||
|
||||
namespace placeholders
|
||||
{
|
||||
|
||||
#if defined(__BORLANDC__) || defined(__GNUC__) && (__GNUC__ < 4)
|
||||
|
||||
static inline boost::arg<1> _1() { return boost::arg<1>(); }
|
||||
static inline boost::arg<2> _2() { return boost::arg<2>(); }
|
||||
static inline boost::arg<3> _3() { return boost::arg<3>(); }
|
||||
static inline boost::arg<4> _4() { return boost::arg<4>(); }
|
||||
static inline boost::arg<5> _5() { return boost::arg<5>(); }
|
||||
static inline boost::arg<6> _6() { return boost::arg<6>(); }
|
||||
static inline boost::arg<7> _7() { return boost::arg<7>(); }
|
||||
static inline boost::arg<8> _8() { return boost::arg<8>(); }
|
||||
static inline boost::arg<9> _9() { return boost::arg<9>(); }
|
||||
|
||||
#elif defined(BOOST_MSVC) || (defined(__DECCXX_VER) && __DECCXX_VER <= 60590031) || defined(__MWERKS__) || \
|
||||
defined(__GNUC__) && (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
|
||||
|
||||
static boost::arg<1> _1;
|
||||
static boost::arg<2> _2;
|
||||
static boost::arg<3> _3;
|
||||
static boost::arg<4> _4;
|
||||
static boost::arg<5> _5;
|
||||
static boost::arg<6> _6;
|
||||
static boost::arg<7> _7;
|
||||
static boost::arg<8> _8;
|
||||
static boost::arg<9> _9;
|
||||
inline boost::arg<1> _1() { return boost::arg<1>(); }
|
||||
inline boost::arg<2> _2() { return boost::arg<2>(); }
|
||||
inline boost::arg<3> _3() { return boost::arg<3>(); }
|
||||
inline boost::arg<4> _4() { return boost::arg<4>(); }
|
||||
inline boost::arg<5> _5() { return boost::arg<5>(); }
|
||||
inline boost::arg<6> _6() { return boost::arg<6>(); }
|
||||
inline boost::arg<7> _7() { return boost::arg<7>(); }
|
||||
inline boost::arg<8> _8() { return boost::arg<8>(); }
|
||||
inline boost::arg<9> _9() { return boost::arg<9>(); }
|
||||
|
||||
#else
|
||||
|
||||
boost::arg<1> _1;
|
||||
boost::arg<2> _2;
|
||||
boost::arg<3> _3;
|
||||
boost::arg<4> _4;
|
||||
boost::arg<5> _5;
|
||||
boost::arg<6> _6;
|
||||
boost::arg<7> _7;
|
||||
boost::arg<8> _8;
|
||||
boost::arg<9> _9;
|
||||
BOOST_STATIC_CONSTEXPR boost::arg<1> _1;
|
||||
BOOST_STATIC_CONSTEXPR boost::arg<2> _2;
|
||||
BOOST_STATIC_CONSTEXPR boost::arg<3> _3;
|
||||
BOOST_STATIC_CONSTEXPR boost::arg<4> _4;
|
||||
BOOST_STATIC_CONSTEXPR boost::arg<5> _5;
|
||||
BOOST_STATIC_CONSTEXPR boost::arg<6> _6;
|
||||
BOOST_STATIC_CONSTEXPR boost::arg<7> _7;
|
||||
BOOST_STATIC_CONSTEXPR boost::arg<8> _8;
|
||||
BOOST_STATIC_CONSTEXPR boost::arg<9> _9;
|
||||
|
||||
#endif
|
||||
|
||||
} // unnamed namespace
|
||||
} // namespace placeholders
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#endif // #ifndef BOOST_BIND_PLACEHOLDERS_HPP_INCLUDED
|
||||
|
||||
@@ -50,4 +50,9 @@ test-suite "bind"
|
||||
[ run bind_function2_test.cpp ]
|
||||
[ run bind_fwd_test.cpp ]
|
||||
[ run bind_fwd2_test.cpp ]
|
||||
[ run bind_no_placeholders_test.cpp ]
|
||||
[ run placeholder_const_ref_test.cpp ]
|
||||
[ run bind_function_ap_test.cpp ]
|
||||
[ run bind_type_test.cpp ]
|
||||
[ run bind_unique_ptr_test.cpp ]
|
||||
;
|
||||
|
||||
224
test/bind_function_ap_test.cpp
Normal file
224
test/bind_function_ap_test.cpp
Normal file
@@ -0,0 +1,224 @@
|
||||
#include <boost/config.hpp>
|
||||
|
||||
//
|
||||
// bind_function_ap_test.cpp - regression test
|
||||
//
|
||||
// Copyright (c) 2015 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
//
|
||||
|
||||
#if defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 406 )
|
||||
# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
#elif defined( __clang__ ) && defined( __has_warning )
|
||||
# if __has_warning( "-Wdeprecated-declarations" )
|
||||
# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include <boost/bind.hpp>
|
||||
#include <boost/function.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
#include <memory>
|
||||
|
||||
//
|
||||
|
||||
void fv1( std::auto_ptr<int> p1 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
}
|
||||
|
||||
void fv2( std::auto_ptr<int> p1, std::auto_ptr<int> p2 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
BOOST_TEST( *p2 == 2 );
|
||||
}
|
||||
|
||||
void fv3( std::auto_ptr<int> p1, std::auto_ptr<int> p2, std::auto_ptr<int> p3 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
BOOST_TEST( *p2 == 2 );
|
||||
BOOST_TEST( *p3 == 3 );
|
||||
}
|
||||
|
||||
void fv4( std::auto_ptr<int> p1, std::auto_ptr<int> p2, std::auto_ptr<int> p3, std::auto_ptr<int> p4 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
BOOST_TEST( *p2 == 2 );
|
||||
BOOST_TEST( *p3 == 3 );
|
||||
BOOST_TEST( *p4 == 4 );
|
||||
}
|
||||
|
||||
void fv5( std::auto_ptr<int> p1, std::auto_ptr<int> p2, std::auto_ptr<int> p3, std::auto_ptr<int> p4, std::auto_ptr<int> p5 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
BOOST_TEST( *p2 == 2 );
|
||||
BOOST_TEST( *p3 == 3 );
|
||||
BOOST_TEST( *p4 == 4 );
|
||||
BOOST_TEST( *p5 == 5 );
|
||||
}
|
||||
|
||||
void fv6( std::auto_ptr<int> p1, std::auto_ptr<int> p2, std::auto_ptr<int> p3, std::auto_ptr<int> p4, std::auto_ptr<int> p5, std::auto_ptr<int> p6 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
BOOST_TEST( *p2 == 2 );
|
||||
BOOST_TEST( *p3 == 3 );
|
||||
BOOST_TEST( *p4 == 4 );
|
||||
BOOST_TEST( *p5 == 5 );
|
||||
BOOST_TEST( *p6 == 6 );
|
||||
}
|
||||
|
||||
void fv7( std::auto_ptr<int> p1, std::auto_ptr<int> p2, std::auto_ptr<int> p3, std::auto_ptr<int> p4, std::auto_ptr<int> p5, std::auto_ptr<int> p6, std::auto_ptr<int> p7 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
BOOST_TEST( *p2 == 2 );
|
||||
BOOST_TEST( *p3 == 3 );
|
||||
BOOST_TEST( *p4 == 4 );
|
||||
BOOST_TEST( *p5 == 5 );
|
||||
BOOST_TEST( *p6 == 6 );
|
||||
BOOST_TEST( *p7 == 7 );
|
||||
}
|
||||
|
||||
void fv8( std::auto_ptr<int> p1, std::auto_ptr<int> p2, std::auto_ptr<int> p3, std::auto_ptr<int> p4, std::auto_ptr<int> p5, std::auto_ptr<int> p6, std::auto_ptr<int> p7, std::auto_ptr<int> p8 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
BOOST_TEST( *p2 == 2 );
|
||||
BOOST_TEST( *p3 == 3 );
|
||||
BOOST_TEST( *p4 == 4 );
|
||||
BOOST_TEST( *p5 == 5 );
|
||||
BOOST_TEST( *p6 == 6 );
|
||||
BOOST_TEST( *p7 == 7 );
|
||||
BOOST_TEST( *p8 == 8 );
|
||||
}
|
||||
|
||||
void fv9( std::auto_ptr<int> p1, std::auto_ptr<int> p2, std::auto_ptr<int> p3, std::auto_ptr<int> p4, std::auto_ptr<int> p5, std::auto_ptr<int> p6, std::auto_ptr<int> p7, std::auto_ptr<int> p8, std::auto_ptr<int> p9 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
BOOST_TEST( *p2 == 2 );
|
||||
BOOST_TEST( *p3 == 3 );
|
||||
BOOST_TEST( *p4 == 4 );
|
||||
BOOST_TEST( *p5 == 5 );
|
||||
BOOST_TEST( *p6 == 6 );
|
||||
BOOST_TEST( *p7 == 7 );
|
||||
BOOST_TEST( *p8 == 8 );
|
||||
BOOST_TEST( *p9 == 9 );
|
||||
}
|
||||
|
||||
void test()
|
||||
{
|
||||
{
|
||||
boost::function<void(std::auto_ptr<int>)> fw1 = boost::bind( fv1, _1 );
|
||||
|
||||
std::auto_ptr<int> p1( new int(1) );
|
||||
|
||||
fw1( p1 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::function<void(std::auto_ptr<int>, std::auto_ptr<int>)> fw2 = boost::bind( fv2, _1, _2 );
|
||||
|
||||
std::auto_ptr<int> p1( new int(1) );
|
||||
std::auto_ptr<int> p2( new int(2) );
|
||||
|
||||
fw2( p1, p2 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::function<void(std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>)> fw3 = boost::bind( fv3, _1, _2, _3 );
|
||||
|
||||
std::auto_ptr<int> p1( new int(1) );
|
||||
std::auto_ptr<int> p2( new int(2) );
|
||||
std::auto_ptr<int> p3( new int(3) );
|
||||
|
||||
fw3( p1, p2, p3 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::function<void(std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>)> fw4 = boost::bind( fv4, _1, _2, _3, _4 );
|
||||
|
||||
std::auto_ptr<int> p1( new int(1) );
|
||||
std::auto_ptr<int> p2( new int(2) );
|
||||
std::auto_ptr<int> p3( new int(3) );
|
||||
std::auto_ptr<int> p4( new int(4) );
|
||||
|
||||
fw4( p1, p2, p3, p4 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::function<void(std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>)> fw5 = boost::bind( fv5, _1, _2, _3, _4, _5 );
|
||||
|
||||
std::auto_ptr<int> p1( new int(1) );
|
||||
std::auto_ptr<int> p2( new int(2) );
|
||||
std::auto_ptr<int> p3( new int(3) );
|
||||
std::auto_ptr<int> p4( new int(4) );
|
||||
std::auto_ptr<int> p5( new int(5) );
|
||||
|
||||
fw5( p1, p2, p3, p4, p5 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::function<void(std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>)> fw6 = boost::bind( fv6, _1, _2, _3, _4, _5, _6 );
|
||||
|
||||
std::auto_ptr<int> p1( new int(1) );
|
||||
std::auto_ptr<int> p2( new int(2) );
|
||||
std::auto_ptr<int> p3( new int(3) );
|
||||
std::auto_ptr<int> p4( new int(4) );
|
||||
std::auto_ptr<int> p5( new int(5) );
|
||||
std::auto_ptr<int> p6( new int(6) );
|
||||
|
||||
fw6( p1, p2, p3, p4, p5, p6 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::function<void(std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>)> fw7 = boost::bind( fv7, _1, _2, _3, _4, _5, _6, _7 );
|
||||
|
||||
std::auto_ptr<int> p1( new int(1) );
|
||||
std::auto_ptr<int> p2( new int(2) );
|
||||
std::auto_ptr<int> p3( new int(3) );
|
||||
std::auto_ptr<int> p4( new int(4) );
|
||||
std::auto_ptr<int> p5( new int(5) );
|
||||
std::auto_ptr<int> p6( new int(6) );
|
||||
std::auto_ptr<int> p7( new int(7) );
|
||||
|
||||
fw7( p1, p2, p3, p4, p5, p6, p7 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::function<void(std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>)> fw8 = boost::bind( fv8, _1, _2, _3, _4, _5, _6, _7, _8 );
|
||||
|
||||
std::auto_ptr<int> p1( new int(1) );
|
||||
std::auto_ptr<int> p2( new int(2) );
|
||||
std::auto_ptr<int> p3( new int(3) );
|
||||
std::auto_ptr<int> p4( new int(4) );
|
||||
std::auto_ptr<int> p5( new int(5) );
|
||||
std::auto_ptr<int> p6( new int(6) );
|
||||
std::auto_ptr<int> p7( new int(7) );
|
||||
std::auto_ptr<int> p8( new int(8) );
|
||||
|
||||
fw8( p1, p2, p3, p4, p5, p6, p7, p8 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::function<void(std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>, std::auto_ptr<int>)> fw9 = boost::bind( fv9, _1, _2, _3, _4, _5, _6, _7, _8, _9 );
|
||||
|
||||
std::auto_ptr<int> p1( new int(1) );
|
||||
std::auto_ptr<int> p2( new int(2) );
|
||||
std::auto_ptr<int> p3( new int(3) );
|
||||
std::auto_ptr<int> p4( new int(4) );
|
||||
std::auto_ptr<int> p5( new int(5) );
|
||||
std::auto_ptr<int> p6( new int(6) );
|
||||
std::auto_ptr<int> p7( new int(7) );
|
||||
std::auto_ptr<int> p8( new int(8) );
|
||||
std::auto_ptr<int> p9( new int(9) );
|
||||
|
||||
fw9( p1, p2, p3, p4, p5, p6, p7, p8, p9 );
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test();
|
||||
return boost::report_errors();
|
||||
}
|
||||
99
test/bind_no_placeholders_test.cpp
Normal file
99
test/bind_no_placeholders_test.cpp
Normal file
@@ -0,0 +1,99 @@
|
||||
//
|
||||
// bind_no_placeholders_test.cpp - test for BOOST_BIND_NO_PLACEHOLDERS
|
||||
//
|
||||
// Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
|
||||
// Copyright (c) 2001 David Abrahams
|
||||
// Copyright (c) 2015 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
//
|
||||
|
||||
#define BOOST_BIND_NO_PLACEHOLDERS
|
||||
#include <boost/bind.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
//
|
||||
|
||||
long f_0()
|
||||
{
|
||||
return 17041L;
|
||||
}
|
||||
|
||||
long f_1(long a)
|
||||
{
|
||||
return a;
|
||||
}
|
||||
|
||||
long f_2(long a, long b)
|
||||
{
|
||||
return a + 10 * b;
|
||||
}
|
||||
|
||||
long f_3(long a, long b, long c)
|
||||
{
|
||||
return a + 10 * b + 100 * c;
|
||||
}
|
||||
|
||||
long f_4(long a, long b, long c, long d)
|
||||
{
|
||||
return a + 10 * b + 100 * c + 1000 * d;
|
||||
}
|
||||
|
||||
long f_5(long a, long b, long c, long d, long e)
|
||||
{
|
||||
return a + 10 * b + 100 * c + 1000 * d + 10000 * e;
|
||||
}
|
||||
|
||||
long f_6(long a, long b, long c, long d, long e, long f)
|
||||
{
|
||||
return a + 10 * b + 100 * c + 1000 * d + 10000 * e + 100000 * f;
|
||||
}
|
||||
|
||||
long f_7(long a, long b, long c, long d, long e, long f, long g)
|
||||
{
|
||||
return a + 10 * b + 100 * c + 1000 * d + 10000 * e + 100000 * f + 1000000 * g;
|
||||
}
|
||||
|
||||
long f_8(long a, long b, long c, long d, long e, long f, long g, long h)
|
||||
{
|
||||
return a + 10 * b + 100 * c + 1000 * d + 10000 * e + 100000 * f + 1000000 * g + 10000000 * h;
|
||||
}
|
||||
|
||||
long f_9(long a, long b, long c, long d, long e, long f, long g, long h, long i)
|
||||
{
|
||||
return a + 10 * b + 100 * c + 1000 * d + 10000 * e + 100000 * f + 1000000 * g + 10000000 * h + 100000000 * i;
|
||||
}
|
||||
|
||||
void function_test()
|
||||
{
|
||||
using namespace boost;
|
||||
|
||||
arg<1> _1;
|
||||
arg<2> _2;
|
||||
arg<3> _3;
|
||||
arg<4> _4;
|
||||
arg<5> _5;
|
||||
arg<6> _6;
|
||||
arg<7> _7;
|
||||
arg<8> _8;
|
||||
arg<9> _9;
|
||||
|
||||
BOOST_TEST( bind(f_0)() == 17041L );
|
||||
BOOST_TEST( bind(f_1, _1)(1) == 1L );
|
||||
BOOST_TEST( bind(f_2, _1, _2)(1, 2) == 21L );
|
||||
BOOST_TEST( bind(f_3, _1, _2, _3)(1, 2, 3) == 321L );
|
||||
BOOST_TEST( bind(f_4, _1, _2, _3, _4)(1, 2, 3, 4) == 4321L );
|
||||
BOOST_TEST( bind(f_5, _1, _2, _3, _4, _5)(1, 2, 3, 4, 5) == 54321L );
|
||||
BOOST_TEST( bind(f_6, _1, _2, _3, _4, _5, _6)(1, 2, 3, 4, 5, 6) == 654321L );
|
||||
BOOST_TEST( bind(f_7, _1, _2, _3, _4, _5, _6, _7)(1, 2, 3, 4, 5, 6, 7) == 7654321L );
|
||||
BOOST_TEST( bind(f_8, _1, _2, _3, _4, _5, _6, _7, _8)(1, 2, 3, 4, 5, 6, 7, 8) == 87654321L );
|
||||
BOOST_TEST( bind(f_9, _1, _2, _3, _4, _5, _6, _7, _8, _9)(1, 2, 3, 4, 5, 6, 7, 8, 9) == 987654321L );
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
function_test();
|
||||
return boost::report_errors();
|
||||
}
|
||||
75
test/bind_type_test.cpp
Normal file
75
test/bind_type_test.cpp
Normal file
@@ -0,0 +1,75 @@
|
||||
#include <boost/config.hpp>
|
||||
|
||||
//
|
||||
// bind_type_test.cpp
|
||||
//
|
||||
// Copyright (c) 2015 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
//
|
||||
|
||||
#include <boost/bind.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
|
||||
//
|
||||
|
||||
template<int I> struct X
|
||||
{
|
||||
};
|
||||
|
||||
void fv1( X<1> )
|
||||
{
|
||||
}
|
||||
|
||||
void fv2( X<1>, X<2> )
|
||||
{
|
||||
}
|
||||
|
||||
void fv3( X<1>, X<2>, X<3> )
|
||||
{
|
||||
}
|
||||
|
||||
void fv4( X<1>, X<2>, X<3>, X<4> )
|
||||
{
|
||||
}
|
||||
|
||||
void fv5( X<1>, X<2>, X<3>, X<4>, X<5> )
|
||||
{
|
||||
}
|
||||
|
||||
void fv6( X<1>, X<2>, X<3>, X<4>, X<5>, X<6> )
|
||||
{
|
||||
}
|
||||
|
||||
void fv7( X<1>, X<2>, X<3>, X<4>, X<5>, X<6>, X<7> )
|
||||
{
|
||||
}
|
||||
|
||||
void fv8( X<1>, X<2>, X<3>, X<4>, X<5>, X<6>, X<7>, X<8> )
|
||||
{
|
||||
}
|
||||
|
||||
void fv9( X<1>, X<2>, X<3>, X<4>, X<5>, X<6>, X<7>, X<8>, X<9> )
|
||||
{
|
||||
}
|
||||
|
||||
void test()
|
||||
{
|
||||
boost::bind( fv1, _1 )( X<1>() );
|
||||
boost::bind( fv2, _1, _2 )( X<1>(), X<2>() );
|
||||
boost::bind( fv3, _1, _2, _3 )( X<1>(), X<2>(), X<3>() );
|
||||
boost::bind( fv4, _1, _2, _3, _4 )( X<1>(), X<2>(), X<3>(), X<4>() );
|
||||
boost::bind( fv5, _1, _2, _3, _4, _5 )( X<1>(), X<2>(), X<3>(), X<4>(), X<5>() );
|
||||
boost::bind( fv6, _1, _2, _3, _4, _5, _6 )( X<1>(), X<2>(), X<3>(), X<4>(), X<5>(), X<6>() );
|
||||
boost::bind( fv7, _1, _2, _3, _4, _5, _6, _7 )( X<1>(), X<2>(), X<3>(), X<4>(), X<5>(), X<6>(), X<7>() );
|
||||
boost::bind( fv8, _1, _2, _3, _4, _5, _6, _7, _8 )( X<1>(), X<2>(), X<3>(), X<4>(), X<5>(), X<6>(), X<7>(), X<8>() );
|
||||
boost::bind( fv9, _1, _2, _3, _4, _5, _6, _7, _8, _9 )( X<1>(), X<2>(), X<3>(), X<4>(), X<5>(), X<6>(), X<7>(), X<8>(), X<9>() );
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test();
|
||||
return boost::report_errors();
|
||||
}
|
||||
207
test/bind_unique_ptr_test.cpp
Normal file
207
test/bind_unique_ptr_test.cpp
Normal file
@@ -0,0 +1,207 @@
|
||||
#include <boost/config.hpp>
|
||||
|
||||
#if defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) || defined( BOOST_NO_CXX11_SMART_PTR )
|
||||
|
||||
int main()
|
||||
{
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
//
|
||||
// bind_unique_ptr_test.cpp
|
||||
//
|
||||
// Copyright (c) 2015 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
//
|
||||
|
||||
#include <boost/bind.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
#include <memory>
|
||||
|
||||
//
|
||||
|
||||
void fv1( std::unique_ptr<int> p1 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
}
|
||||
|
||||
void fv2( std::unique_ptr<int> p1, std::unique_ptr<int> p2 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
BOOST_TEST( *p2 == 2 );
|
||||
}
|
||||
|
||||
void fv3( std::unique_ptr<int> p1, std::unique_ptr<int> p2, std::unique_ptr<int> p3 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
BOOST_TEST( *p2 == 2 );
|
||||
BOOST_TEST( *p3 == 3 );
|
||||
}
|
||||
|
||||
void fv4( std::unique_ptr<int> p1, std::unique_ptr<int> p2, std::unique_ptr<int> p3, std::unique_ptr<int> p4 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
BOOST_TEST( *p2 == 2 );
|
||||
BOOST_TEST( *p3 == 3 );
|
||||
BOOST_TEST( *p4 == 4 );
|
||||
}
|
||||
|
||||
void fv5( std::unique_ptr<int> p1, std::unique_ptr<int> p2, std::unique_ptr<int> p3, std::unique_ptr<int> p4, std::unique_ptr<int> p5 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
BOOST_TEST( *p2 == 2 );
|
||||
BOOST_TEST( *p3 == 3 );
|
||||
BOOST_TEST( *p4 == 4 );
|
||||
BOOST_TEST( *p5 == 5 );
|
||||
}
|
||||
|
||||
void fv6( std::unique_ptr<int> p1, std::unique_ptr<int> p2, std::unique_ptr<int> p3, std::unique_ptr<int> p4, std::unique_ptr<int> p5, std::unique_ptr<int> p6 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
BOOST_TEST( *p2 == 2 );
|
||||
BOOST_TEST( *p3 == 3 );
|
||||
BOOST_TEST( *p4 == 4 );
|
||||
BOOST_TEST( *p5 == 5 );
|
||||
BOOST_TEST( *p6 == 6 );
|
||||
}
|
||||
|
||||
void fv7( std::unique_ptr<int> p1, std::unique_ptr<int> p2, std::unique_ptr<int> p3, std::unique_ptr<int> p4, std::unique_ptr<int> p5, std::unique_ptr<int> p6, std::unique_ptr<int> p7 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
BOOST_TEST( *p2 == 2 );
|
||||
BOOST_TEST( *p3 == 3 );
|
||||
BOOST_TEST( *p4 == 4 );
|
||||
BOOST_TEST( *p5 == 5 );
|
||||
BOOST_TEST( *p6 == 6 );
|
||||
BOOST_TEST( *p7 == 7 );
|
||||
}
|
||||
|
||||
void fv8( std::unique_ptr<int> p1, std::unique_ptr<int> p2, std::unique_ptr<int> p3, std::unique_ptr<int> p4, std::unique_ptr<int> p5, std::unique_ptr<int> p6, std::unique_ptr<int> p7, std::unique_ptr<int> p8 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
BOOST_TEST( *p2 == 2 );
|
||||
BOOST_TEST( *p3 == 3 );
|
||||
BOOST_TEST( *p4 == 4 );
|
||||
BOOST_TEST( *p5 == 5 );
|
||||
BOOST_TEST( *p6 == 6 );
|
||||
BOOST_TEST( *p7 == 7 );
|
||||
BOOST_TEST( *p8 == 8 );
|
||||
}
|
||||
|
||||
void fv9( std::unique_ptr<int> p1, std::unique_ptr<int> p2, std::unique_ptr<int> p3, std::unique_ptr<int> p4, std::unique_ptr<int> p5, std::unique_ptr<int> p6, std::unique_ptr<int> p7, std::unique_ptr<int> p8, std::unique_ptr<int> p9 )
|
||||
{
|
||||
BOOST_TEST( *p1 == 1 );
|
||||
BOOST_TEST( *p2 == 2 );
|
||||
BOOST_TEST( *p3 == 3 );
|
||||
BOOST_TEST( *p4 == 4 );
|
||||
BOOST_TEST( *p5 == 5 );
|
||||
BOOST_TEST( *p6 == 6 );
|
||||
BOOST_TEST( *p7 == 7 );
|
||||
BOOST_TEST( *p8 == 8 );
|
||||
BOOST_TEST( *p9 == 9 );
|
||||
}
|
||||
|
||||
void test()
|
||||
{
|
||||
{
|
||||
std::unique_ptr<int> p1( new int(1) );
|
||||
|
||||
boost::bind( fv1, _1 )( std::move( p1 ) );
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr<int> p1( new int(1) );
|
||||
std::unique_ptr<int> p2( new int(2) );
|
||||
|
||||
boost::bind( fv2, _1, _2 )( std::move( p1 ), std::move( p2 ) );
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr<int> p1( new int(1) );
|
||||
std::unique_ptr<int> p2( new int(2) );
|
||||
std::unique_ptr<int> p3( new int(3) );
|
||||
|
||||
boost::bind( fv3, _1, _2, _3 )( std::move( p1 ), std::move( p2 ), std::move( p3 ) );
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr<int> p1( new int(1) );
|
||||
std::unique_ptr<int> p2( new int(2) );
|
||||
std::unique_ptr<int> p3( new int(3) );
|
||||
std::unique_ptr<int> p4( new int(4) );
|
||||
|
||||
boost::bind( fv4, _1, _2, _3, _4 )( std::move( p1 ), std::move( p2 ), std::move( p3 ), std::move( p4 ) );
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr<int> p1( new int(1) );
|
||||
std::unique_ptr<int> p2( new int(2) );
|
||||
std::unique_ptr<int> p3( new int(3) );
|
||||
std::unique_ptr<int> p4( new int(4) );
|
||||
std::unique_ptr<int> p5( new int(5) );
|
||||
|
||||
boost::bind( fv5, _1, _2, _3, _4, _5 )( std::move( p1 ), std::move( p2 ), std::move( p3 ), std::move( p4 ), std::move( p5 ) );
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr<int> p1( new int(1) );
|
||||
std::unique_ptr<int> p2( new int(2) );
|
||||
std::unique_ptr<int> p3( new int(3) );
|
||||
std::unique_ptr<int> p4( new int(4) );
|
||||
std::unique_ptr<int> p5( new int(5) );
|
||||
std::unique_ptr<int> p6( new int(6) );
|
||||
|
||||
boost::bind( fv6, _1, _2, _3, _4, _5, _6 )( std::move( p1 ), std::move( p2 ), std::move( p3 ), std::move( p4 ), std::move( p5 ), std::move( p6 ) );
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr<int> p1( new int(1) );
|
||||
std::unique_ptr<int> p2( new int(2) );
|
||||
std::unique_ptr<int> p3( new int(3) );
|
||||
std::unique_ptr<int> p4( new int(4) );
|
||||
std::unique_ptr<int> p5( new int(5) );
|
||||
std::unique_ptr<int> p6( new int(6) );
|
||||
std::unique_ptr<int> p7( new int(7) );
|
||||
|
||||
boost::bind( fv7, _1, _2, _3, _4, _5, _6, _7 )( std::move( p1 ), std::move( p2 ), std::move( p3 ), std::move( p4 ), std::move( p5 ), std::move( p6 ), std::move( p7 ) );
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr<int> p1( new int(1) );
|
||||
std::unique_ptr<int> p2( new int(2) );
|
||||
std::unique_ptr<int> p3( new int(3) );
|
||||
std::unique_ptr<int> p4( new int(4) );
|
||||
std::unique_ptr<int> p5( new int(5) );
|
||||
std::unique_ptr<int> p6( new int(6) );
|
||||
std::unique_ptr<int> p7( new int(7) );
|
||||
std::unique_ptr<int> p8( new int(8) );
|
||||
|
||||
boost::bind( fv8, _1, _2, _3, _4, _5, _6, _7, _8 )( std::move( p1 ), std::move( p2 ), std::move( p3 ), std::move( p4 ), std::move( p5 ), std::move( p6 ), std::move( p7 ), std::move( p8 ) );
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr<int> p1( new int(1) );
|
||||
std::unique_ptr<int> p2( new int(2) );
|
||||
std::unique_ptr<int> p3( new int(3) );
|
||||
std::unique_ptr<int> p4( new int(4) );
|
||||
std::unique_ptr<int> p5( new int(5) );
|
||||
std::unique_ptr<int> p6( new int(6) );
|
||||
std::unique_ptr<int> p7( new int(7) );
|
||||
std::unique_ptr<int> p8( new int(8) );
|
||||
std::unique_ptr<int> p9( new int(9) );
|
||||
|
||||
boost::bind( fv9, _1, _2, _3, _4, _5, _6, _7, _8, _9 )( std::move( p1 ), std::move( p2 ), std::move( p3 ), std::move( p4 ), std::move( p5 ), std::move( p6 ), std::move( p7 ), std::move( p8 ), std::move( p9 ) );
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test();
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
#endif // #if defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) || defined( BOOST_NO_CXX11_SMART_PTR )
|
||||
37
test/placeholder_const_ref_test.cpp
Normal file
37
test/placeholder_const_ref_test.cpp
Normal file
@@ -0,0 +1,37 @@
|
||||
//
|
||||
// placeholder_const_ref_test.cpp - forming a const& to _1
|
||||
//
|
||||
// Copyright 2015 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
//
|
||||
|
||||
#include <boost/bind/placeholders.hpp>
|
||||
#include <boost/is_placeholder.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
//
|
||||
|
||||
template<class T> void test( T const &, int i )
|
||||
{
|
||||
BOOST_TEST_EQ( boost::is_placeholder<T>::value, i );
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
using namespace boost::placeholders;
|
||||
|
||||
test( _1, 1 );
|
||||
test( _2, 2 );
|
||||
test( _3, 3 );
|
||||
test( _4, 4 );
|
||||
test( _5, 5 );
|
||||
test( _6, 6 );
|
||||
test( _7, 7 );
|
||||
test( _8, 8 );
|
||||
test( _9, 9 );
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
@@ -8,7 +8,7 @@
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#include <boost/bind/protect.hpp>
|
||||
#include <boost/bind/bind.hpp>
|
||||
#include <boost/bind.hpp>
|
||||
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user