Front Page / Metafunctions / Type Selection / if_

# if_

### Synopsis

    template<
          typename C
        , typename T1
        , typename T2
        >
    struct if_
    {
        typedef unspecified type;
    };

### Description

Returns one of its two arguments, `T1` or `T2`, depending on the value `C`.

### Header

    #include <boost/mpl/if.hpp>

### Parameters

Parameter | Requirement | Description
--- | --- | ---
`C` | Integral Constant | A selection condition.
`T1`, `T2` | Any type | Types to select from.

### Expression semantics

For any Integral Constant `c` and arbitrary types `t1`, `t2`:

    typedef if_<c,t1,t2>::type t;

Return type: | Any type.
Semantics: | If `c::value == true`, `t` is identical to `t1`; otherwise `t` is identical to `t2`.

### Example

    typedef if_<true_,char,long>::type t1;
    typedef if_<false_,char,long>::type t2;

    BOOST_MPL_ASSERT(( is_same<t1, char> ));
    BOOST_MPL_ASSERT(( is_same<t2, long> ));

    // allocates space for an object of class T on heap or "inplace"
    // depending on its size
    template< typename T > struct lightweight
    {
        // ...
        typedef typename if_<
              less_equal< sizeof_<T>, sizeof_<T*> >
            , inplace_storage<T>
            , heap_storage<T>
            >::type impl_t;

        impl_t impl;
    };

### See also

Metafunctions, Integral Constant, if_c, eval_if