| <?xml version="1.0" encoding="utf-8"?> |
| <!DOCTYPE header PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN" |
| "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd"> |
| <header name="boost/variant/recursive_variant.hpp"> |
| <namespace name="boost"> |
| |
| <typedef name="recursive_variant_"> |
| <type><emphasis>unspecified</emphasis></type> |
| </typedef> |
| |
| <class name="make_recursive_variant"> |
| <purpose>Simplifies declaration of recursive <code>variant</code> types.</purpose> |
| |
| <template> |
| <template-type-parameter name="T1"/> |
| <template-type-parameter name="T2"> |
| <default><emphasis>unspecified</emphasis></default> |
| </template-type-parameter> |
| <template-varargs/> |
| <template-type-parameter name="TN"> |
| <default><emphasis>unspecified</emphasis></default> |
| </template-type-parameter> |
| </template> |
| |
| <description> |
| <para><code>type</code> has behavior equivalent in every respect to |
| some <code>variant< U1, U2, ..., UN ></code>, where each type |
| <code>U<emphasis>i</emphasis></code> is the result of the |
| corresponding type <code>T<emphasis>i</emphasis></code> undergone a |
| transformation function. The following pseudo-code specifies the |
| behavior of this transformation (call it <code>substitute</code>): |
| |
| <itemizedlist> |
| <listitem>If <code>T<emphasis>i</emphasis></code> is |
| <code>boost::recursive_variant_</code> then: |
| <code>variant< U1, U2, ..., UN ></code>;</listitem> |
| <listitem>Else if <code>T<emphasis>i</emphasis></code> is of the |
| form <code>X *</code> then: |
| <code>substitute(X) *</code>;</listitem> |
| <listitem>Else if <code>T<emphasis>i</emphasis></code> is of the |
| form <code>X &</code> then: |
| <code>substitute(X) &</code>;</listitem> |
| <listitem>Else if <code>T<emphasis>i</emphasis></code> is of the |
| form <code>R (*)( X1, X2, ..., XN )</code> then: |
| <code>substitute(R) (*)( substitute(X1), substitute(X2), ..., substitute(XN) )</code>;</listitem> |
| <listitem>Else if <code>T<emphasis>i</emphasis></code> is of the |
| form <code>F < X1, X2, ..., XN ></code> then: |
| <code>F< substitute(X1), substitute(X2), ..., substitute(XN) ></code>;</listitem> |
| <listitem>Else: <code>T<emphasis>i</emphasis></code>.</listitem> |
| </itemizedlist> |
| </para> |
| |
| <para>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.</para> |
| |
| <para>Use of <code>make_recursive_variant</code> is demonstrated in |
| <xref linkend="variant.tutorial.recursive.recursive-variant"/>.</para> |
| |
| <para><emphasis role="bold">Portability</emphasis>: Due to standard |
| conformance issues in several compilers, |
| <code>make_recursive_variant</code> is not universally supported. On |
| these compilers the library indicates its lack of support via the |
| definition of the preprocessor symbol |
| <code><macroname>BOOST_VARIANT_NO_FULL_RECURSIVE_VARIANT_SUPPORT</macroname></code>.</para> |
| </description> |
| |
| <typedef name="type"> |
| <type><classname>boost::variant</classname>< <emphasis>unspecified</emphasis> ></type> |
| </typedef> |
| |
| </class> |
| |
| <class name="make_recursive_variant_over"> |
| <purpose> |
| <simpara>Exposes a recursive <code>variant</code> whose bounded types |
| are the elements of the given type sequence.</simpara> |
| </purpose> |
| |
| <template> |
| <template-type-parameter name="Sequence"/> |
| </template> |
| |
| <typedef name="type"> |
| <type>variant< <emphasis>unspecified</emphasis> ></type> |
| </typedef> |
| |
| <description> |
| <simpara><code>type</code> has behavior equivalent in every respect to |
| <code><classname>make_recursive_variant</classname>< Sequence[0], Sequence[1], ... >::type</code> |
| (where <code>Sequence[<emphasis>i</emphasis>]</code> denotes the |
| <emphasis>i</emphasis>-th element of <code>Sequence</code>), except |
| that no upper limit is imposed on the number of types.</simpara> |
| |
| <simpara><emphasis role="bold">Notes</emphasis>:</simpara> |
| <itemizedlist> |
| <listitem><code>Sequence</code> must meet the requirements of |
| <libraryname>MPL</libraryname>'s <emphasis>Sequence</emphasis> |
| concept.</listitem> |
| <listitem>Due to standard conformance problems in several compilers, |
| <code>make_recursive_variant_over</code> may not be supported on |
| your compiler. See |
| <code><macroname>BOOST_VARIANT_NO_TYPE_SEQUENCE_SUPPORT</macroname></code> |
| for more information.</listitem> |
| </itemizedlist> |
| </description> |
| </class> |
| |
| </namespace> |
| </header> |