.. Metafunctions/Concepts//Metafunction Class |20

.. Copyright Aleksey Gurtovoy, David Abrahams 2007.
.. Distributed under the Boost
.. Software License, Version 1.0. (See accompanying
.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

Metafunction Class
==================

Summary
-------

A *metafunction class* is a certain form of metafunction representation 
that enables higher-order metaprogramming. More precisely, it's a class
with a publicly-accessible nested |metafunction| called ``apply``. 
Correspondingly, a metafunction class invocation is defined as invocation
of its nested ``apply`` metafunction.


Expression requirements
-----------------------

|In the following table...| ``f`` is a |Metafunction Class|.

+-------------------------------+---------------------------+---------------------------+
| Expression                    | Type                      | Complexity                |
+===============================+===========================+===========================+
| ``f::apply::type``            | Any type                  | Unspecified.              |
+-------------------------------+---------------------------+---------------------------+
| ``f::apply<>::type``          | Any type                  | Unspecified.              |
+-------------------------------+---------------------------+---------------------------+
| ``f::apply<a1,...an>::type``  | Any type                  | Unspecified.              |
+-------------------------------+---------------------------+---------------------------+


Expression semantics
--------------------

.. parsed-literal::

    typedef f::apply::type x;

:Precondition:
    ``f`` is a nullary |Metafunction Class|; ``f::apply::type`` is a *type-name*.

:Semantics:
    ``x`` is the result of the metafunction class invocation.


.. ...................................................................................

.. parsed-literal::

    typedef f::apply<>::type x;

:Precondition:
    ``f`` is a nullary |Metafunction Class|; ``f::apply<>::type`` is a *type-name*.

:Semantics:
    ``x`` is the result of the metafunction class invocation.


.. ...................................................................................

.. parsed-literal::

    typedef f::apply<a1,\ |...|\ a\ *n*\>::type x;

:Precondition:
    ``f`` is an *n*-ary metafunction class; ``apply`` is a |Metafunction|.
    
:Semantics:
    ``x`` is the result of the metafunction class
    invocation with the actual arguments |a1...an|.


Models
------

* |always|
* |arg|
* |quote|
* |numeric_cast|
* |unpack_args|


See also
--------

|Metafunctions|, |Metafunction|, |Lambda Expression|, |Invocation|, |apply_wrap|, |bind|, |quote|
