//// 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 //// [#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>; ```