mirror of
https://github.com/boostorg/bind.git
synced 2026-04-14 13:45:55 +02:00
Compare commits
78 Commits
boost-1.42
...
boost-1.56
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1480db5679 | ||
|
|
f53694ef25 | ||
|
|
0afd49b884 | ||
|
|
dd67e3f785 | ||
|
|
c92a49d5c2 | ||
|
|
a6b17d9001 | ||
|
|
ea05f23163 | ||
|
|
fafb6bb650 | ||
|
|
f7e101e928 | ||
|
|
166c4b6be7 | ||
|
|
8414233b9c | ||
|
|
15d6d6ac95 | ||
|
|
ba117db120 | ||
|
|
f5c95610b6 | ||
|
|
ce0fc0f69a | ||
|
|
aa8a94273d | ||
|
|
92ff08b873 | ||
|
|
6315df35d6 | ||
|
|
96fd1e7036 | ||
|
|
7ff6524bd1 | ||
|
|
0f66412487 | ||
|
|
af136e483d | ||
|
|
5b2cf44de5 | ||
|
|
5e2fc717f0 | ||
|
|
9955139c65 | ||
|
|
fa8debfc80 | ||
|
|
da3580cc14 | ||
|
|
27003baf12 | ||
|
|
c53ba15ce5 | ||
|
|
3d60d74ff0 | ||
|
|
7b89dd7fd9 | ||
|
|
787d3cb7b4 | ||
|
|
f89c41dc7b | ||
|
|
7aa58cf653 | ||
|
|
1bf8cd6c7a | ||
|
|
e5d99ce085 | ||
|
|
17282c97c2 | ||
|
|
f02b090fe8 | ||
|
|
f3da835e0b | ||
|
|
73fc778b61 | ||
|
|
26ee2825fe | ||
|
|
dc1e4dbfae | ||
|
|
45a1f1434b | ||
|
|
bc50ab0ba3 | ||
|
|
010349ec9b | ||
|
|
8ae9e8460d | ||
|
|
5d49fb45d0 | ||
|
|
4000680b6a | ||
|
|
851903fcc4 | ||
|
|
1d79533df7 | ||
|
|
f09a7a5747 | ||
|
|
0b72bfbd9b | ||
|
|
61519fcae2 | ||
|
|
48c5a6e682 | ||
|
|
1b292ee487 | ||
|
|
0dd5dae4e8 | ||
|
|
203ca82ef2 | ||
|
|
037a4d1976 | ||
|
|
dfd3da2cc4 | ||
|
|
aef08dd0cd | ||
|
|
ef993c777a | ||
|
|
f58543ac11 | ||
|
|
f1afd17717 | ||
|
|
e73f08edee | ||
|
|
3c24cbedf6 | ||
|
|
79f8680eda | ||
|
|
e163aeb563 | ||
|
|
ce24d4f735 | ||
|
|
41d9fbc317 | ||
|
|
2f595f53f5 | ||
|
|
c746cf26de | ||
|
|
a695360c4f | ||
|
|
0aadd1805d | ||
|
|
0cc198acc2 | ||
|
|
b272145f3e | ||
|
|
bfe10df38a | ||
|
|
c69a4ad382 | ||
|
|
683d699e4a |
47
bind.html
47
bind.html
@@ -61,6 +61,7 @@
|
||||
bind<R>(f, ...)</A></h4>
|
||||
<h4 style="MARGIN-LEFT: 40pt"><A href="#err_nonstd">Binding a nonstandard function</A></h4>
|
||||
<h4 style="MARGIN-LEFT: 40pt"><A href="#err_overloaded">Binding an overloaded function</A></h4>
|
||||
<h4 style="MARGIN-LEFT: 40pt"><A href="#err_modeling_stl_function_object_concepts">Modeling STL function object concepts</A></h4>
|
||||
<h4 style="MARGIN-LEFT: 40pt"><A href="#err_const_arg"><b>const</b> in signatures</A></h4>
|
||||
<h4 style="MARGIN-LEFT: 40pt"><A href="#err_msvc_using">MSVC specific: using
|
||||
boost::bind;</A></h4>
|
||||
@@ -271,7 +272,7 @@ bind(&X::f, p, _1)(i); // (<i>internal copy of p</i>)->f(i)
|
||||
</p>
|
||||
<P>This feature of <b>bind</b> can be used to perform function composition. See <A href="bind_as_compose.cpp">
|
||||
bind_as_compose.cpp</A> for an example that demonstrates how to use <b>bind</b>
|
||||
to achieve similar functionality to <A href="../compose/index.htm">Boost.Compose</A>.
|
||||
to achieve similar functionality to <A href="http://www.boost.org/doc/libs/1_31_0/libs/compose/index.htm">Boost.Compose</A>.
|
||||
</P>
|
||||
<p>Note that the first argument - the bound function object - is not evaluated,
|
||||
even when it's a function object that is produced by <STRONG>bind</STRONG> or a
|
||||
@@ -389,7 +390,7 @@ void connect()
|
||||
<p>As a general rule, the function objects generated by <b>bind</b> take their
|
||||
arguments by reference and cannot, therefore, accept non-const temporaries or
|
||||
literal constants. This is an inherent limitation of the C++ language in its
|
||||
current (2003) incarnation, known as <A href="http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2002/n1385.htm">
|
||||
current (2003) incarnation, known as <A href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm">
|
||||
the forwarding problem</A>. (It will be fixed in the next standard, usually
|
||||
called C++0x.)</p>
|
||||
<p>The library uses signatures of the form
|
||||
@@ -585,6 +586,48 @@ int main()
|
||||
boost::bind( get, _1 );
|
||||
}
|
||||
</pre>
|
||||
<h3><a name="err_modeling_stl_function_object_concepts">Modeling STL function object concepts</a></h3>
|
||||
<p>The function objects that are produced by <b>boost::bind</b> do not model the
|
||||
STL <a href="http://www.sgi.com/tech/stl/UnaryFunction.html">Unary Function</a> or
|
||||
<a href="http://www.sgi.com/tech/stl/BinaryFunction.html">Binary Function</a> concepts,
|
||||
even when the function objects are unary or binary operations, because the function object
|
||||
types are missing public typedefs <tt>result_type</tt> and <tt>argument_type</tt> or
|
||||
<tt>first_argument_type</tt> and <tt>second_argument_type</tt>. In cases where these
|
||||
typedefs are desirable, however, the utility function <tt>make_adaptable</tt>
|
||||
can be used to adapt unary and binary function objects to these concepts. This allows
|
||||
unary and binary function objects resulting from <b>boost::bind</b> to be combined with
|
||||
STL templates such as <a href="http://msdn.microsoft.com/en-us/library/se0409db%28v=VS.90%29.aspx"><tt>std::unary_negate</tt></a>
|
||||
and <a href="http://msdn.microsoft.com/en-us/library/833073z4%28v=VS.90%29.aspx"><tt>std::binary_negate</tt></a>.</p>
|
||||
|
||||
<p>The <tt>make_adaptable</tt> function is defined in <<a href="../../boost/bind/make_adaptable.hpp">boost/bind/make_adaptable.hpp</a>>,
|
||||
which must be included explicitly in addition to <boost/bind.hpp>:</p>
|
||||
<pre>
|
||||
#include <boost/bind/make_adaptable.hpp>
|
||||
|
||||
template <class R, class F> <i>unspecified-type</i> make_adaptable(F f);
|
||||
|
||||
template<class R, class A1, class F> <i>unspecified-unary-functional-type</i> make_adaptable(F f);
|
||||
|
||||
template<class R, class A1, class A2, class F> <i>unspecified-binary-functional-type</i> make_adaptable(F f);
|
||||
|
||||
template<class R, class A1, class A2, class A3, class F> <i>unspecified-ternary-functional-type</i> make_adaptable(F f);
|
||||
|
||||
template<class R, class A1, class A2, class A3, class A4, class F> <i>unspecified-4-ary-functional-type</i> make_adaptable(F f);
|
||||
</pre>
|
||||
|
||||
<p>This example shows how to use <tt>make_adaptable</tt> to make a predicate for "is not a space":</p>
|
||||
<pre>typedef char char_t;
|
||||
std::locale loc("");
|
||||
const std::ctype<char_t>& ct = std::use_facet<std::ctype<char_t> >(loc);
|
||||
|
||||
auto isntspace = std::not1( boost::make_adaptable<bool, char_t>( boost::bind(&std::ctype<char_t>::is, &ct, std::ctype_base::space, _1) ) );
|
||||
</pre>
|
||||
|
||||
<p>In this example, <b>boost::bind</b> creates the "is a space" (unary) predicate.
|
||||
It is then passed to <tt>make_adaptable</tt> so that a function object modeling
|
||||
the Unary Function concept can be created, serving as the argument to
|
||||
<a href="http://msdn.microsoft.com/en-us/library/syyszzf8%28v=VS.90%29.aspx"><tt>std::not1</tt></a>.</p>
|
||||
|
||||
<h3><a name="err_const_arg"><b>const</b> in signatures</a></h3>
|
||||
<p>Some compilers, including MSVC 6.0 and Borland C++ 5.5.1, have problems with the
|
||||
top-level <b>const</b> in function signatures:
|
||||
|
||||
@@ -9,5 +9,6 @@ import boostbook : boostbook ;
|
||||
boostbook ref-doc : ref.xml
|
||||
:
|
||||
<format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/doc/html
|
||||
<xsl:param>boost.root=../../../..
|
||||
;
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/is_placeholder.hpp>
|
||||
#include <boost/static_assert.hpp>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
@@ -33,8 +34,7 @@ template< int I > struct arg
|
||||
|
||||
template< class T > arg( T const & /* t */ )
|
||||
{
|
||||
// static assert I == is_placeholder<T>::value
|
||||
typedef char T_must_be_placeholder[ I == is_placeholder<T>::value? 1: -1 ];
|
||||
BOOST_STATIC_ASSERT( I == is_placeholder<T>::value );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1680,7 +1680,7 @@ template< class R, class T > struct add_cref< R (T::*) (), 1 >
|
||||
typedef void type;
|
||||
};
|
||||
|
||||
#if !( defined(__IBMCPP__) && BOOST_WORKAROUND( __IBMCPP__, BOOST_TESTED_AT(600) ) )
|
||||
#if !defined(__IBMCPP__) || __IBMCPP_FUNC_CV_TMPL_ARG_DEDUCTION
|
||||
|
||||
template< class R, class T > struct add_cref< R (T::*) () const, 1 >
|
||||
{
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
namespace
|
||||
{
|
||||
|
||||
#if defined(__BORLANDC__) || defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ < 400)
|
||||
#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>(); }
|
||||
@@ -38,7 +38,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__ * 100 + __GNUC_MINOR__ == 400)
|
||||
defined(__GNUC__) && (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
|
||||
|
||||
static boost::arg<1> _1;
|
||||
static boost::arg<2> _2;
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<title>Boost: mem_fn.hpp documentation</title>
|
||||
@@ -146,7 +145,7 @@ void k(std::vector<boost::shared_ptr<X> > const & v)
|
||||
<p>
|
||||
Yes. For simple uses, <b>mem_fn</b> provides additional functionality that the
|
||||
standard adaptors do not. Complicated expressions that use <b>std::bind1st</b>, <b>std::bind2nd</b>
|
||||
or <a href="../compose/index.htm"><b>Boost.Compose</b></a> along with the
|
||||
or <a href="http://www.boost.org/doc/libs/1_31_0/libs/compose/index.htm"><b>Boost.Compose</b></a> along with the
|
||||
standard adaptors can be rewritten using <a href="bind.html"><b>boost::bind</b></a>
|
||||
that automatically takes advantage of <b>mem_fn</b>.
|
||||
</p>
|
||||
|
||||
@@ -33,6 +33,12 @@
|
||||
|
||||
struct X
|
||||
{
|
||||
// SGI-related compilers have odd compiler-synthesized ctors dtors
|
||||
#ifdef __PATHSCALE__
|
||||
X() {}
|
||||
~X() {}
|
||||
#endif
|
||||
|
||||
int operator()()
|
||||
{
|
||||
return 17041;
|
||||
|
||||
@@ -43,6 +43,11 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
// SGI-related compilers have odd compiler-synthesized ctors and dtors
|
||||
#ifdef __PATHSCALE__
|
||||
~X() {}
|
||||
#endif
|
||||
|
||||
int state() const
|
||||
{
|
||||
return state_;
|
||||
|
||||
@@ -39,128 +39,128 @@ struct X
|
||||
// 0
|
||||
|
||||
int mf0_1() { return 0; }
|
||||
int mf0_2() { return 0; }
|
||||
int mf0_2() { return 1; }
|
||||
|
||||
int cmf0_1() const { return 0; }
|
||||
int cmf0_2() const { return 0; }
|
||||
int cmf0_2() const { return 1; }
|
||||
|
||||
void mf0v_1() {}
|
||||
void mf0v_2() {}
|
||||
void mf0v_2() { static int x; ++x; }
|
||||
|
||||
void cmf0v_1() const {}
|
||||
void cmf0v_2() const {}
|
||||
void cmf0v_2() const { static int x; ++x; }
|
||||
|
||||
// 1
|
||||
|
||||
int mf1_1(int) { return 0; }
|
||||
int mf1_2(int) { return 0; }
|
||||
int mf1_2(int) { return 1; }
|
||||
|
||||
int cmf1_1(int) const { return 0; }
|
||||
int cmf1_2(int) const { return 0; }
|
||||
int cmf1_2(int) const { return 1; }
|
||||
|
||||
void mf1v_1(int) {}
|
||||
void mf1v_2(int) {}
|
||||
void mf1v_2(int) { static int x; ++x; }
|
||||
|
||||
void cmf1v_1(int) const {}
|
||||
void cmf1v_2(int) const {}
|
||||
void cmf1v_2(int) const { static int x; ++x; }
|
||||
|
||||
// 2
|
||||
|
||||
int mf2_1(int, int) { return 0; }
|
||||
int mf2_2(int, int) { return 0; }
|
||||
int mf2_2(int, int) { return 1; }
|
||||
|
||||
int cmf2_1(int, int) const { return 0; }
|
||||
int cmf2_2(int, int) const { return 0; }
|
||||
int cmf2_2(int, int) const { return 1; }
|
||||
|
||||
void mf2v_1(int, int) {}
|
||||
void mf2v_2(int, int) {}
|
||||
void mf2v_2(int, int) { static int x; ++x; }
|
||||
|
||||
void cmf2v_1(int, int) const {}
|
||||
void cmf2v_2(int, int) const {}
|
||||
void cmf2v_2(int, int) const { static int x; ++x; }
|
||||
|
||||
// 3
|
||||
|
||||
int mf3_1(int, int, int) { return 0; }
|
||||
int mf3_2(int, int, int) { return 0; }
|
||||
int mf3_2(int, int, int) { return 1; }
|
||||
|
||||
int cmf3_1(int, int, int) const { return 0; }
|
||||
int cmf3_2(int, int, int) const { return 0; }
|
||||
int cmf3_2(int, int, int) const { return 1; }
|
||||
|
||||
void mf3v_1(int, int, int) {}
|
||||
void mf3v_2(int, int, int) {}
|
||||
void mf3v_2(int, int, int) { static int x; ++x; }
|
||||
|
||||
void cmf3v_1(int, int, int) const {}
|
||||
void cmf3v_2(int, int, int) const {}
|
||||
void cmf3v_2(int, int, int) const { static int x; ++x; }
|
||||
|
||||
// 4
|
||||
|
||||
int mf4_1(int, int, int, int) { return 0; }
|
||||
int mf4_2(int, int, int, int) { return 0; }
|
||||
int mf4_2(int, int, int, int) { return 1; }
|
||||
|
||||
int cmf4_1(int, int, int, int) const { return 0; }
|
||||
int cmf4_2(int, int, int, int) const { return 0; }
|
||||
int cmf4_2(int, int, int, int) const { return 1; }
|
||||
|
||||
void mf4v_1(int, int, int, int) {}
|
||||
void mf4v_2(int, int, int, int) {}
|
||||
void mf4v_2(int, int, int, int) { static int x; ++x; }
|
||||
|
||||
void cmf4v_1(int, int, int, int) const {}
|
||||
void cmf4v_2(int, int, int, int) const {}
|
||||
void cmf4v_2(int, int, int, int) const { static int x; ++x; }
|
||||
|
||||
// 5
|
||||
|
||||
int mf5_1(int, int, int, int, int) { return 0; }
|
||||
int mf5_2(int, int, int, int, int) { return 0; }
|
||||
int mf5_2(int, int, int, int, int) { return 1; }
|
||||
|
||||
int cmf5_1(int, int, int, int, int) const { return 0; }
|
||||
int cmf5_2(int, int, int, int, int) const { return 0; }
|
||||
int cmf5_2(int, int, int, int, int) const { return 1; }
|
||||
|
||||
void mf5v_1(int, int, int, int, int) {}
|
||||
void mf5v_2(int, int, int, int, int) {}
|
||||
void mf5v_2(int, int, int, int, int) { static int x; ++x; }
|
||||
|
||||
void cmf5v_1(int, int, int, int, int) const {}
|
||||
void cmf5v_2(int, int, int, int, int) const {}
|
||||
void cmf5v_2(int, int, int, int, int) const { static int x; ++x; }
|
||||
|
||||
// 6
|
||||
|
||||
int mf6_1(int, int, int, int, int, int) { return 0; }
|
||||
int mf6_2(int, int, int, int, int, int) { return 0; }
|
||||
int mf6_2(int, int, int, int, int, int) { return 1; }
|
||||
|
||||
int cmf6_1(int, int, int, int, int, int) const { return 0; }
|
||||
int cmf6_2(int, int, int, int, int, int) const { return 0; }
|
||||
int cmf6_2(int, int, int, int, int, int) const { return 1; }
|
||||
|
||||
void mf6v_1(int, int, int, int, int, int) {}
|
||||
void mf6v_2(int, int, int, int, int, int) {}
|
||||
void mf6v_2(int, int, int, int, int, int) { static int x; ++x; }
|
||||
|
||||
void cmf6v_1(int, int, int, int, int, int) const {}
|
||||
void cmf6v_2(int, int, int, int, int, int) const {}
|
||||
void cmf6v_2(int, int, int, int, int, int) const { static int x; ++x; }
|
||||
|
||||
// 7
|
||||
|
||||
int mf7_1(int, int, int, int, int, int, int) { return 0; }
|
||||
int mf7_2(int, int, int, int, int, int, int) { return 0; }
|
||||
int mf7_2(int, int, int, int, int, int, int) { return 1; }
|
||||
|
||||
int cmf7_1(int, int, int, int, int, int, int) const { return 0; }
|
||||
int cmf7_2(int, int, int, int, int, int, int) const { return 0; }
|
||||
int cmf7_2(int, int, int, int, int, int, int) const { return 1; }
|
||||
|
||||
void mf7v_1(int, int, int, int, int, int, int) {}
|
||||
void mf7v_2(int, int, int, int, int, int, int) {}
|
||||
void mf7v_2(int, int, int, int, int, int, int) { static int x; ++x; }
|
||||
|
||||
void cmf7v_1(int, int, int, int, int, int, int) const {}
|
||||
void cmf7v_2(int, int, int, int, int, int, int) const {}
|
||||
void cmf7v_2(int, int, int, int, int, int, int) const { static int x; ++x; }
|
||||
|
||||
// 8
|
||||
|
||||
int mf8_1(int, int, int, int, int, int, int, int) { return 0; }
|
||||
int mf8_2(int, int, int, int, int, int, int, int) { return 0; }
|
||||
int mf8_2(int, int, int, int, int, int, int, int) { return 1; }
|
||||
|
||||
int cmf8_1(int, int, int, int, int, int, int, int) const { return 0; }
|
||||
int cmf8_2(int, int, int, int, int, int, int, int) const { return 0; }
|
||||
int cmf8_2(int, int, int, int, int, int, int, int) const { return 1; }
|
||||
|
||||
void mf8v_1(int, int, int, int, int, int, int, int) {}
|
||||
void mf8v_2(int, int, int, int, int, int, int, int) {}
|
||||
void mf8v_2(int, int, int, int, int, int, int, int) { static int x; ++x; }
|
||||
|
||||
void cmf8v_1(int, int, int, int, int, int, int, int) const {}
|
||||
void cmf8v_2(int, int, int, int, int, int, int, int) const {}
|
||||
void cmf8v_2(int, int, int, int, int, int, int, int) const { static int x; ++x; }
|
||||
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user