Front Page / Metafunctions / Miscellaneous / inherit

# inherit

### Synopsis

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

    ...

    template<
          typename T1, typename T2,... typename Tn
        >
    struct inheritn
    {
        typedef unspecified type;
    };

    template<
          typename T1
        , typename T2
        ...
        , typename Tn = unspecified
        >
    struct inherit
    {
        typedef unspecified type;
    };

### Description

Returns an unspecified class type publically derived from `T1`, `T2`,... `Tn`. Guarantees that derivation from `empty_base` is always a no-op, regardless of the position and number of `empty_base` classes in `T1`, `T2`,... `Tn`.

### Header

    #include <boost/mpl/inherit.hpp>

### Model of

Metafunction

### Parameters

Parameter | Requirement | Description
--- | --- | ---
`T1`, `T2`,... `Tn` | A class type | Classes to derived from.

### Expression semantics

For artibrary class types t1,t2,... tn:

    typedef inherit2<t1,t2>::type r;

Return type: | A class type.
Precondition: | `t1` and `t2` are complete types.
Semantics: | If both `t1` and `t2` are identical to `empty_base`, equivalent to
    typedef empty_base r;
otherwise, if `t1` is identical to `empty_base`, equivalent to
    typedef t2 r;
otherwise, if `t2` is identical to `empty_base`, equivalent to
    typedef t1 r;
otherwise equivalent to
    struct r : t1, t2 {};

    typedef inheritn<t1,t2,...tn>::type r;

Return type: | A class type.
Precondition: | t1,t2,... tn are complete types.
Semantics: | Equivalent to
    struct r
        : inherit2<
              inheritn-1<t1,t2,...tn-1>::type
            , tn
            >
    {
    };

    typedef inherit<t1,t2,...tn>::type r;

Precondition: | t1,t2,... tn are complete types.
Return type: | A class type.
Semantics: | Equivalent to
    typedef inheritn<t1,t2,...tn>::type r;

### Complexity

Amortized constant time.

### Example

    struct udt1 { int n; };
    struct udt2 {};

    typedef inherit<udt1,udt2>::type r1;
    typedef inherit<empty_base,udt1>::type r2;
    typedef inherit<empty_base,udt1,empty_base,empty_base>::type r3;
    typedef inherit<udt1,empty_base,udt2>::type r4;
    typedef inherit<empty_base,empty_base>::type r5;

    BOOST_MPL_ASSERT(( is_base_and_derived< udt1, r1> ));
    BOOST_MPL_ASSERT(( is_base_and_derived< udt2, r1> ));
    BOOST_MPL_ASSERT(( is_same< r2, udt1> ));
    BOOST_MPL_ASSERT(( is_same< r3, udt1 > ));
    BOOST_MPL_ASSERT(( is_base_and_derived< udt1, r4 > ));
    BOOST_MPL_ASSERT(( is_base_and_derived< udt2, r4 > ));
    BOOST_MPL_ASSERT(( is_same< r5, empty_base > ));

### See also

Metafunctions, `empty_base`, `inherit_linearly`, `identity`