Boost C++ Libraries of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

This is the documentation for an old version of Boost. Click here to view this page for the latest version.

Class template make_recursive_variant

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


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

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


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.