Abstract
This paper describes the Boost C++ template metaprogramming library (MPL), an extensible compile-time framework of algorithms, sequences and metafunction classes. The library brings together important abstractions from the generic and functional programming worlds to build a powerful and easy-to-use toolset which makes template metaprogramming practical enough for the real-world environments. The MPL is heavily influenced by its run-time equivalent - the Standard Template Library (STL), a part of the C++ standard library [STL94], [ISO98]. Like the STL, it defines an open conceptual and implementation framework which can serve as a foundation for future contributions in the domain. The library's fundamental concepts and idioms enable the user to focus on solutions without navigating the universe of possible ad-hoc approaches to a given metaprogramming problem, even if no actual MPL code is used. The library also provides a compile-time lambda expression facility enabling arbitrary currying and composition of class templates, a feature whose runtime counterpart is often cited as missing from the STL. This paper explains the motivation, usage, design, and implementation of the MPL with examples of its real-life applications, and offers some lessons learned about C++ template metaprogramming.
Keywords: template metaprogramming, generic programming, programming languages, C++, STL, type systems, polymorphism, compile-time
Table of Contents
- 1. Introduction
-
- 1.1. Native language metaprogramming
- 1.2. Metaprogramming in C++
-
- 1.2.1. Numeric computations
- 1.2.2. Type computations
- 1.2.3. Type sequences
- 1.3. Why metaprogramming?
- 1.4. Why a metaprogramming library?
- 2. Basic usage
-
- 2.1. Conditional type selection
-
- 2.1.1. Delayed evaluation
- 2.2. Metafunctions
-
- 2.2.1. The simple form
- 2.2.2. Higher-order metafunctions
- 2.2.3. Metafunction classes
- 2.2.4. One size fits all?
- 2.2.5. From metafunction to metafunction class
- 2.3. Sequences, algorithms, and iterators
-
- 2.3.1. Introduction
- 2.3.2. Algorithms and sequences
- 2.3.3. Sequence concepts
- 2.3.4. Ad hoc example revisited
- 2.3.5. iter_fold as the main iteration algorithm
- 2.3.6. Sequences of numbers
- 2.3.7. A variety of sequences
- 2.3.8. Loop/recursion unrolling
- 3. Lambda facility
- 4. Code generation facilities
- 5. Example: a compile-time FSM generator
-
- 5.1. Implementation
- 5.2. Related work
- 6. Acknowledgements
- References
