[#metafunction] [section Template metafunction] A ['template metafunction] represents a function over types that is evaluated at compile-time. It is implemented by a template class. The template arguments of that class are expected to be types (`class` or `typename` template arguments). They represent the arguments of the metafunction. Instances of the template class are expected to have a public nested type called `type`. This type is the type the metafunction returns. Template metafunction are expected to be called with [link metaprogramming_value template metaprogramming values] as arguments only. Template metafunctions are expected to return template metaprogramming values. For example this is the identity template metafunction: template struct identity { using type = T; }; This metafunction is called `identity`. It takes one argument, `T`. The result of calling this metafunction is its argument, `T`. To call this metafunction, one has to instantiate the template class. The template arguments it is instantiated with are the arguments the metafunction is called with. For example: identity>::type The above example calls the metafunction `identity` with `std::integral_constant` as its argument. [endsect]