[/ / 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) /] [section:definitions Definitions] A /list/ is a '''—''' usually but not necessarily variadic '''—''' template class whose parameters are all types, for example `mp_list`, `mp_list<>`, `std::tuple`, `std::pair`, `std::shared_ptr`. A /metafunction/ is a class template or a template alias whose parameters are all types, for example `std::add_pointer_t`, `std::is_const`, `mp_second`, `mp_push_front`, `mp_list`, `std::tuple`, `std::pair`, `std::shared_ptr`, or template using F1 = void; template using F2 = T*; template using F3 = std::integral_constant; A /quoted metafunction/ is a class with a public metafunction member called `fn`, for example struct Q1 { template using fn = void; }; struct Q2 { template using fn = T*; }; struct Q3 { template using fn = std::integral_constant; }; An /integral constant type/ is a class with a public member `value` that is an integral constant in the C++ sense. For example, `std::integral_constant`, or struct N { static int constexpr value = 2; }; A /set/ is a list whose elements are unique. A /map/ is a list of lists, the inner lists having at least one element (the key.) The keys of the map must be unique. For example, using M1 = std::tuple, std::pair, std::pair>; using M2 = mp_list, mp_list, mp_list>; [endsect:definitions]