[/ / 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:function Helper Metafunctions, ``] [section `mp_and`] template using mp_and = /*...*/; `mp_and` is an alias for the first type `U` in `T...` for which `mp_to_bool` is `mp_false`. If no such type exists, the last one is returned. `mp_and<>` is `mp_true`. Similar to `std::conjunction` in C++17. [endsect] [section `mp_all`] template using mp_all = /*...*/; `mp_all` is `mp_true` if `mp_to_bool` is `mp_true` for all types `U` in `T...`, `mp_false` otherwise. Same as `mp_and`, but does not perform short-circuit evaluation. `mp_and` is `mp_false`, but `mp_all` is an error because `void` does not have a nested `value`. The upside is that `mp_all` is faster. [endsect] [section `mp_or`] template using mp_or = /*...*/; `mp_or` is an alias for the first type `U` in `T...` for which `mp_to_bool` is `mp_true`. If no such type exists, the last one is returned. `mp_or<>` is `mp_false`. Similar to `std::disjunction` in C++17. [endsect] [section `mp_any`] template using mp_any = /*...*/; `mp_any` is `mp_true` if `mp_to_bool` is `mp_true` for any type `U` in `T...`, `mp_false` otherwise. Same as `mp_or`, but does not perform short-circuit evaluation. [endsect] [endsect]