//// Copyright 2017 Peter Dimov Distributed under the Boost Software License, Version 1.0. See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt //// [#overview] # Overview Mp11 is a C++11 metaprogramming library for compile-time manipulation of data structures that contain types. It's based on template aliases and variadic templates and implements the approach outlined in the article <> and <>. Reading these articles before proceeding with this documentation is _highly_ recommended. The general principles upon which Mp11 is built are that algorithms and metafunctions are template aliases of the form `F` and data structures are lists of the form `L`, with the library placing no requirements on `L`. `mp_list` is the built-in list type, but `std::tuple`, `std::pair` and `std::variant` are also perfectly legitimate list types, although of course `std::pair`, due to having exactly two elements, is not resizeable and will consequently not work with algorithms that need to add or remove elements. Another distinguishing feature of this approach is that lists (`L`) have the same form as metafunctions (`F`) and can therefore be used as such. For example, applying `std::add_pointer_t` to the list `std::tuple` by way of `mp_transform>` gives us `std::tuple`, but we can also apply `mp_list` to the same tuple: using R = mp_transform>; and get `std::tuple, mp_list>`.