...one of the most highly
regarded and expertly designed C++ library projects in the
world.

— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards

A *metafunction class* is a certain form of metafunction representation that enables higher-order metaprogramming. In particular, a non-nullary metafunction class is a type with a nested class template member `apply`

. A nullary metafunction class has the form of a nullary metafunction. A metafunction class invocation is defined as invocation of its nested `apply`

metafunction.

Expression | Expression type |
---|---|

`typename f::type` | A type |

`typename f::template apply<a1,..,an>::type` | A type |

Expression | Complexity | Precondition | Semantics | Postcondition |
---|---|---|---|---|

`typename f::type` | unspecified | `f` is a nullary metafunction class; `f::type` is a type-name | `f::type` is the result of the metafunction class invocation | |

`typename f::template apply<a1,..,an>::type` | unspecified | `f` is an `n` -ary metafunction class; `apply` is a metafunction | `typename f::template apply<a1,..,an>::type` is the result of the metafunction class invocation with the actual arguments `a1,..,an` |

// nullary metafunction class struct always_true { typedef true_ type; };template< long N > struct le { template< typename M > struct apply { typedef bool_< (M::value < N) > type; }; };

// unary metafunction class typedef le<5> less_than_5;

// binary metafunction class struct less_than { template< typename N1, typename N2 > struct apply { typedef bool_< (N1::value < N2::value) > type; }; };

// invocations typedef always_true::type t1; typedef less_than_5::apply< int_<7> >::type t2; typedef less_than::apply< int_<5>,int_<7> >::type t3;

// results checks BOOST_STATIC_ASSERT(t1::value); BOOST_STATIC_ASSERT(!t2::value); BOOST_STATIC_ASSERT(t3::value);

Table of Contents

Last edited March 10, 2003 4:16 am