forked from boostorg/mpl
92 lines
2.7 KiB
ReStructuredText
92 lines
2.7 KiB
ReStructuredText
.. Metafunctions/Concepts//Metafunction Class |20
|
|
|
|
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|
|
|
|
|
|
|
.. copyright:: Copyright © 2001-2009 Aleksey Gurtovoy and David Abrahams
|
|
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)
|