Front Page / Metafunctions / Concepts / Metafunction

# Metafunction

### Description

A metafunction is a class or a class template that represents a function invocable at compile-time. An non-nullary metafunction is invoked by instantiating the class template with particular template parameters (metafunction arguments); the result of the metafunction application is accessible through the instantiation's nested `type` typedef. All metafunction's arguments must be types (i.e. only type template parameters are allowed). A metafunction can have a variable number of parameters. A nullary metafunction is represented as a (template) class with a nested `type` typename member.

### Expression requirements

In the following table and subsequent specifications, `f` is a Metafunction.

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

### Expression semantics

    typedef f::type x;

Precondition: | `f` is a nullary Metafunction; `f::type` is a type-name.
Semantics: | `x` is the result of the metafunction invocation.

    typedef f<>::type x;

Precondition: | `f` is a nullary Metafunction; `f<>::type` is a type-name.
Semantics: | `x` is the result of the metafunction invocation.

    typedef f<a1,... an>::type x;

Precondition: | `f` is an n-ary Metafunction; `a1`,... `an` are types; `f<a1,...an>::type` is a type-name.
Semantics: | `x` is the result of the metafunction invocation with the actual arguments `a1`,... `an`.

### Models

- `identity`
- `plus`
- `begin`
- `insert`
- `fold`

### See also

Metafunctions, Metafunction Class, Lambda Expression, invocation, `apply`, `lambda`, `bind`