- Dimensional Analysis
- Higher-Order Metafunctions
- Handling Placeholders
- More Lambda Capabilities
- Lambda Details
- Details
- Exercises

## 3.4 More Lambda Capabilities

Lambda expressions provide much more than just the ability to pass a metafunction as an argument. The two capabilities described next combine to make lambda expressions an invaluable part of almost every metaprogramming task.

#### 3.4.1 Partial Metafunction Application

Consider the lambda expression `mpl::plus<_1,_1>`. A single argument is directed to both of `plus`'s parameters, thereby adding a number to itself. Thus, a *binary* metafunction, `plus`, is used to build a *unary* lambda expression. In other words, we've created a whole new computation! We're not done yet, though: By supplying a non-placeholder as one of the arguments, we can build a unary lambda expression that adds a fixed value, say 42, to its argument:

mpl::plus<_1, mpl::int_<42> >

The process of binding argument values to a subset of a function's parameters is known in the world of functional programming as **partial function application**.

#### 3.4.2 Metafunction Composition

Lambda expressions can also be used to assemble more interesting computations from simple metafunctions. For example, the following expression, which multiplies the sum of two numbers by their difference, is a **composition** of the three metafunctions `multiplies`, `plus`, and `minus`:

mpl::multiplies<mpl::plus<_1,_2>, mpl::minus<_1,_2> >

When evaluating a lambda expression, *MPL* checks to see if any of its arguments are themselves lambda expressions, and evaluates each one that it finds. The results of these inner evaluations are substituted into the outer expression before it is evaluated.