The MPL Reference Manual: and_

Front Page / Metafunctions / Logical Operations / and_

# and_

### Synopsis

    template<
          typename F1
        , typename F2
        ...
        , typename Fn = unspecified
        >
    struct and_
    {
        typedef unspecified type;
    };

### Description

Returns the result of short-circuit logical and (`&&`) operation on its arguments.

### Header

    #include <boost/mpl/and.hpp>
    #include <boost/mpl/logical.hpp>

### Parameters

Parameter | Requirement | Description
--- | --- | ---
`F1`, `F2`,... `Fn` | Nullary Metafunction | Operation's arguments.

### Expression semantics

For arbitrary nullary Metafunctions `f1`, `f2`,... `fn`:

    typedef and_<f1,f2,...,fn>::type r;

Return type: | Integral Constant.
Semantics: | `r` is `false_` if either of `f1::type::value`, `f2::type::value`,... `fn::type::value` expressions evaluates to `false`, and `true_` otherwise; guarantees left-to-right evaluation; the operands subsequent to the first `f`i metafunction that evaluates to `false` are not evaluated.

    typedef and_<f1,f2,...,fn> r;

Return type: | Integral Constant.
Semantics: | Equivalent to
    struct r : and_<f1,f2,...,fn>::type {};

### Example

    struct unknown;

    BOOST_MPL_ASSERT(( and_< true_,true_ > ));
    BOOST_MPL_ASSERT_NOT(( and_< false_,true_ > ));
    BOOST_MPL_ASSERT_NOT(( and_< true_,false_ > ));
    BOOST_MPL_ASSERT_NOT(( and_< false_,false_ > ));
    BOOST_MPL_ASSERT_NOT(( and_< false_,unknown > )); // OK
    BOOST_MPL_ASSERT_NOT(( and_< false_,unknown,unknown > )); // OK too

### See also

Metafunctions, Logical Operations, or_, not_