Front Page / Metafunctions / Concepts / Metafunction Class

# 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 and subsequent specifications, `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

    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.

    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.

    typedef f::apply<a1,...an>::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`