Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_33_1/libs/mpl/doc/src/refmanual/bind.rst @ 12

Last change on this file since 12 was 12, checked in by landauf, 18 years ago

added boost

File size: 4.5 KB

bind

Synopsis

template<
      typename F
    >
struct bind0
{
    // |unspecified|
    // |...|
};
template<
      typename F, typename A1
    >
struct bind1
{
    // |unspecified|
    // |...|
};
|...|
template<
      typename F, typename A1,|...| typename An
    >
struct bindn
{
    // |unspecified|
    // |...|
};
template<
      typename F
    , typename A1 = |unspecified|
    |...|
    , typename An = |unspecified|
    >
struct bind
{
    // |unspecified|
    // |...|
};

Description

bind is a higher-order primitive for |Metafunction Class| composition and argument binding. In essence, it's a compile-time counterpart of the similar run-time functionality provided by |Boost.Bind| and |Boost.Lambda| libraries.

Parameters

Parameter Requirement Description
F |Metafunction Class| An metafunction class to perform binding on.
|A1...An| Any type Arguments to bind.

Expression semantics

For any |Metafunction Class| f and arbitrary types |a1...an|:

typedef bind<f,a1,...an> g;
typedef bindn<f,a1,...an> g;
Return type:|Metafunction Class|
Semantics:

Equivalent to

struct g
{
    template<
          typename U1 = |unspecified|
        |...|
        , typename Un = |unspecified|
        >
    struct apply
        : apply_wrapn<
              typename h0<f,U1,|...|Un>::type
            , typename h1<a1,U1,|...|Un>::type
            |...|
            , typename hn<an,U1,|...|Un>::type
            >
    {
    };
};

where hk is equivalent to

template< typename X, typename U1,|...| typename Un > struct hk
    : apply_wrapn<X,U1,|...|Un>
{
};

if f or ak is a |bind expression| or a |placeholder|, and

template< typename X, typename U1,|...| typename Un > struct hk
{
    typedef X type;
};

otherwise. |Note:| Every nth appearance of the `unnamed placeholder`__ in the bind<f,a1,...an> specialization is replaced with the corresponding numbered placeholder _n |-- end note|

Example

struct f1
{
    template< typename T1 > struct apply
    {
        typedef T1 type;
    };
};
struct f5
{
    template< typename T1, typename T2, typename T3, typename T4, typename T5 >
    struct apply
    {
        typedef T5 type;
    };
};
typedef apply_wrap1<
      bind1<f1,_1>
    , int
    >::type r11;
typedef apply_wrap5<
      bind1<f1,_5>
    , void,void,void,void,int
    >::type r12;
BOOST_MPL_ASSERT(( is_same<r11,int> ));
BOOST_MPL_ASSERT(( is_same<r12,int> ));
typedef apply_wrap5<
      bind5<f5,_1,_2,_3,_4,_5>
    , void,void,void,void,int
    >::type r51;
typedef apply_wrap5<
      bind5<f5,_5,_4,_3,_2,_1>
    , int,void,void,void,void
    >::type r52;
BOOST_MPL_ASSERT(( is_same<r51,int> ));
BOOST_MPL_ASSERT(( is_same<r52,int> ));
Note: See TracBrowser for help on using the repository browser.