1 | // Copyright David Abrahams, Daniel Wallin 2003. |
2 | // Distributed under the Boost Software License, Version 1.0. |
3 | // (See accompanying file LICENSE_1_0.txt or copy at |
4 | // http://www.boost.org/LICENSE_1_0.txt) |
5 | |
6 | #ifndef BOOST_PARAMETER_OPTIONAL_HPP |
7 | #define BOOST_PARAMETER_OPTIONAL_HPP |
8 | |
9 | #include <boost/parameter/aux_/use_default.hpp> |
10 | |
11 | namespace boost { namespace parameter { |
12 | |
13 | // This metafunction can be used to describe the treatment of particular |
14 | // named parameters for the purposes of overload elimination with SFINAE, |
15 | // by placing specializations in the parameters<...> list. In order for |
16 | // a treated function to participate in overload resolution: |
17 | // |
18 | // - The actual argument type matched by every keyword tag |
19 | // associated with a predicate must satisfy that predicate |
20 | // |
21 | // - If a keyword k is specified without an optional<...> or |
22 | // required<...> wrapper, it is treated as though |
23 | // optional<k> were specified. |
24 | template < |
25 | typename Tag |
26 | , typename Predicate = ::boost::parameter::aux::use_default |
27 | > |
28 | struct optional |
29 | { |
30 | typedef Tag key_type; |
31 | typedef Predicate predicate; |
32 | }; |
33 | }} |
34 | |
35 | #include <boost/parameter/config.hpp> |
36 | |
37 | #if defined(BOOST_PARAMETER_CAN_USE_MP11) |
38 | #include <boost/mp11/integral.hpp> |
39 | #else |
40 | #include <boost/mpl/bool.hpp> |
41 | #endif |
42 | |
43 | namespace boost { namespace parameter { namespace aux { |
44 | |
45 | template <typename T> |
46 | struct is_optional |
47 | #if defined(BOOST_PARAMETER_CAN_USE_MP11) |
48 | : ::boost::mp11::mp_false |
49 | #else |
50 | : ::boost::mpl::false_ |
51 | #endif |
52 | { |
53 | }; |
54 | |
55 | template <typename Tag, typename Predicate> |
56 | struct is_optional< ::boost::parameter::optional<Tag,Predicate> > |
57 | #if defined(BOOST_PARAMETER_CAN_USE_MP11) |
58 | : ::boost::mp11::mp_true |
59 | #else |
60 | : ::boost::mpl::true_ |
61 | #endif |
62 | { |
63 | }; |
64 | }}} // namespace boost::parameter::aux |
65 | |
66 | #endif // include guard |
67 | |
68 | |