| Home | Libraries | People | FAQ | More

## Class template make_recursive_variant

boost::make_recursive_variant — Simplifies declaration of recursive `variant` types.

## Synopsis

    // In header: <boost/variant/recursive_variant.hpp>

    template<typename T1, typename T2 = unspecified, ...,
             typename TN = unspecified>
    class make_recursive_variant {
    public:
      // types
      typedef boost::variant< unspecified > type;
    };

## Description

`type` has behavior equivalent in every respect to some `variant< U1, U2, ..., UN >`, where each type `Ui` is the result of the corresponding type `Ti` undergone a transformation function. The following pseudo-code specifies the behavior of this transformation (call it `substitute`):

- If `Ti` is `boost::recursive_variant_` then: `variant< U1, U2, ..., UN >`;
- Else if `Ti` is of the form `X *` then: `substitute(X) *`;
- Else if `Ti` is of the form `X &` then: `substitute(X) &`;
- Else if `Ti` is of the form `R (*)( X1, X2, ..., XN )` then: `substitute(R) (*)( substitute(X1), substitute(X2), ..., substitute(XN) )`;
- Else if `Ti` is of the form `F < X1, X2, ..., XN >` then: `F< substitute(X1), substitute(X2), ..., substitute(XN) >`;
- Else: `Ti`.

Note that cv-qualifiers are preserved and that the actual process is generally a bit more complicated. However, the above does convey the essential idea as well as describe the extent of the substititions.

Use of `make_recursive_variant` is demonstrated in the section called “Recursive types with make_recursive_variant”.

Portability: Due to standard conformance issues in several compilers, `make_recursive_variant` is not universally supported. On these compilers the library indicates its lack of support via the definition of the preprocessor symbol `BOOST_VARIANT_NO_FULL_RECURSIVE_VARIANT_SUPPORT`.