1 // Copyright Daniel Wallin, David Abrahams 2005.
2 // Copyright Cromwell D. Enage 2017.
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
7 #ifndef BOOST_PARAMETER_TAGGED_ARGUMENT_050328_HPP
8 #define BOOST_PARAMETER_TAGGED_ARGUMENT_050328_HPP
10 namespace boost { namespace parameter { namespace aux {
12 struct error_const_lvalue_bound_to_out_parameter;
13 struct error_lvalue_bound_to_consume_parameter;
14 struct error_rvalue_bound_to_out_parameter;
15 }}} // namespace boost::parameter::aux
17 #include <boost/parameter/keyword_fwd.hpp>
18 #include <boost/parameter/config.hpp>
19 #include <boost/mpl/eval_if.hpp>
20 #include <boost/type_traits/is_same.hpp>
21 #include <boost/type_traits/remove_const.hpp>
23 #if defined(BOOST_PARAMETER_CAN_USE_MP11)
24 #include <boost/mp11/integral.hpp>
25 #include <boost/mp11/utility.hpp>
26 #include <type_traits>
29 namespace boost { namespace parameter { namespace aux {
31 template <typename Keyword, typename Arg>
32 #if defined(BOOST_PARAMETER_CAN_USE_MP11)
33 using tagged_argument_type = ::boost::mp11::mp_if<
36 , ::boost::mp11::mp_false
38 typename Keyword::qualifier
39 , ::boost::parameter::consume_reference
42 , ::boost::parameter::aux::error_lvalue_bound_to_consume_parameter
43 , ::boost::mp11::mp_if<
45 , ::boost::mp11::mp_if<
47 typename Keyword::qualifier
48 , ::boost::parameter::out_reference
50 , ::boost::parameter::aux
51 ::error_const_lvalue_bound_to_out_parameter
52 , ::std::remove_const<Arg>
54 , ::boost::mp11::mp_identity<Arg>
57 #else // !defined(BOOST_PARAMETER_CAN_USE_MP11)
58 struct tagged_argument_type
59 : ::boost::mpl::eval_if<
61 typename Keyword::qualifier
62 , ::boost::parameter::out_reference
64 , ::boost::parameter::aux::error_const_lvalue_bound_to_out_parameter
65 , ::boost::remove_const<Arg>
69 #endif // BOOST_PARAMETER_CAN_USE_MP11
70 }}} // namespace boost::parameter::aux
72 #include <boost/parameter/aux_/tagged_argument_fwd.hpp>
73 #include <boost/parameter/aux_/is_tagged_argument.hpp>
74 #include <boost/parameter/aux_/default.hpp>
75 #include <boost/parameter/aux_/void.hpp>
76 #include <boost/parameter/aux_/arg_list.hpp>
77 #include <boost/parameter/aux_/result_of0.hpp>
78 #include <boost/mpl/bool.hpp>
79 #include <boost/mpl/if.hpp>
80 #include <boost/mpl/identity.hpp>
81 #include <boost/mpl/apply_wrap.hpp>
82 #include <boost/type_traits/is_const.hpp>
83 #include <boost/type_traits/is_function.hpp>
84 #include <boost/type_traits/is_scalar.hpp>
85 #include <boost/type_traits/remove_reference.hpp>
87 #if defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
88 #include <boost/function.hpp>
93 #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
94 #include <boost/core/enable_if.hpp>
97 namespace boost { namespace parameter { namespace aux {
99 // Holds an lvalue reference to an argument of type Arg associated with
101 template <typename Keyword, typename Arg>
102 class tagged_argument
103 : public ::boost::parameter::aux::tagged_argument_base
105 #if defined(BOOST_PARAMETER_CAN_USE_MP11)
106 using arg_type = typename ::boost::parameter::aux
107 ::tagged_argument_type<Keyword,Arg>::type;
109 typedef typename ::boost::mpl::eval_if<
110 typename ::boost::mpl::eval_if<
111 ::boost::is_scalar<Arg>
112 , ::boost::mpl::false_
114 typename Keyword::qualifier
115 , ::boost::parameter::consume_reference
118 , ::boost::parameter::aux::error_lvalue_bound_to_consume_parameter
119 , ::boost::mpl::eval_if<
120 ::boost::is_const<Arg>
121 , ::boost::parameter::aux::tagged_argument_type<Keyword,Arg>
122 , ::boost::mpl::identity<Arg>
125 #endif // BOOST_PARAMETER_CAN_USE_MP11
128 typedef Keyword key_type;
130 // Wrap plain (non-UDT) function objects in either
131 // a boost::function or a std::function. -- Cromwell D. Enage
132 #if defined(BOOST_PARAMETER_CAN_USE_MP11)
133 using value_type = ::boost::mp11::mp_if<
134 ::std::is_function<arg_type>
135 , ::std::function<arg_type>
138 #else // !defined(BOOST_PARAMETER_CAN_USE_MP11)
139 typedef typename ::boost::mpl::if_<
140 ::boost::is_function<arg_type>
141 #if defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
142 , ::boost::function<arg_type>
144 , ::std::function<arg_type>
148 #endif // BOOST_PARAMETER_CAN_USE_MP11
150 // If Arg is void_, then this type will evaluate to void_&. If the
151 // supplied argument is a plain function, then this type will evaluate
152 // to a reference-to-const function wrapper type. If the supplied
153 // argument is an lvalue, then Arg will be deduced to the lvalue
154 // reference. -- Cromwell D. Enage
155 #if defined(BOOST_PARAMETER_CAN_USE_MP11)
156 using reference = ::boost::mp11::mp_if<
157 ::std::is_function<arg_type>
162 typedef typename ::boost::mpl::if_<
163 ::boost::is_function<arg_type>
170 // Store plain functions by value, everything else by reference.
171 // -- Cromwell D. Enage
172 #if defined(BOOST_PARAMETER_CAN_USE_MP11)
173 ::boost::mp11::mp_if<
174 ::std::is_function<arg_type>
179 typename ::boost::mpl::if_<
180 ::boost::is_function<arg_type>
187 inline explicit BOOST_CONSTEXPR tagged_argument(reference x)
192 inline BOOST_CONSTEXPR tagged_argument(tagged_argument const& copy)
197 // A metafunction class that, given a keyword and a default type,
198 // returns the appropriate result type for a keyword lookup given
202 template <typename KW, typename Default, typename Reference>
204 : ::boost::mpl::eval_if<
205 ::boost::is_same<KW,key_type>
206 , ::boost::mpl::if_<Reference,reference,value_type>
207 , ::boost::mpl::identity<Default>
212 #if defined(BOOST_PARAMETER_CAN_USE_MP11)
213 template <typename KW, typename Default, typename Reference>
214 using fn = ::boost::mp11::mp_if<
215 ::std::is_same<KW,key_type>
216 , ::boost::mp11::mp_if<Reference,reference,value_type>
222 #if !defined(BOOST_PARAMETER_CAN_USE_MP11)
223 // Comma operator to compose argument list without using parameters<>.
224 // Useful for argument lists with undetermined length.
225 template <typename Keyword2, typename Arg2>
226 inline BOOST_CONSTEXPR ::boost::parameter::aux::arg_list<
227 ::boost::parameter::aux::tagged_argument<Keyword,Arg>
228 , ::boost::parameter::aux::arg_list<
229 ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
233 ::boost::parameter::aux
234 ::tagged_argument<Keyword2,Arg2> const& x
237 return ::boost::parameter::aux::arg_list<
238 ::boost::parameter::aux::tagged_argument<Keyword,Arg>
239 , ::boost::parameter::aux::arg_list<
240 ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
244 , ::boost::parameter::aux::arg_list<
245 ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
246 >(x, ::boost::parameter::aux::empty_arg_list())
250 template <typename Keyword2, typename Arg2>
251 inline BOOST_CONSTEXPR ::boost::parameter::aux::arg_list<
252 ::boost::parameter::aux::tagged_argument<Keyword,Arg>
253 , ::boost::parameter::aux::arg_list<
254 ::boost::parameter::aux::tagged_argument_rref<Keyword2,Arg2>
258 ::boost::parameter::aux
259 ::tagged_argument_rref<Keyword2,Arg2> const& x
262 return ::boost::parameter::aux::arg_list<
263 ::boost::parameter::aux::tagged_argument<Keyword,Arg>
264 , boost::parameter::aux::arg_list<
265 boost::parameter::aux::tagged_argument_rref<Keyword2,Arg2>
269 , ::boost::parameter::aux::arg_list<
270 ::boost::parameter::aux
271 ::tagged_argument_rref<Keyword2,Arg2>
272 >(x, ::boost::parameter::aux::empty_arg_list())
275 #endif // BOOST_PARAMETER_CAN_USE_MP11
277 // Accessor interface.
278 inline BOOST_CONSTEXPR reference get_value() const
283 inline BOOST_CONSTEXPR reference
284 operator[](::boost::parameter::keyword<Keyword> const&) const
286 return this->get_value();
289 template <typename Default>
290 inline BOOST_CONSTEXPR reference
292 ::boost::parameter::aux::default_<key_type,Default> const&
295 return this->get_value();
298 template <typename F>
299 inline BOOST_CONSTEXPR reference
301 ::boost::parameter::aux::lazy_default<key_type,F> const&
304 return this->get_value();
307 template <typename KW, typename Default>
308 inline BOOST_CONSTEXPR Default&
310 ::boost::parameter::aux::default_<KW,Default> const& x
316 template <typename KW, typename Default>
317 inline BOOST_CONSTEXPR Default&&
319 ::boost::parameter::aux::default_r_<KW,Default> const& x
322 return ::std::forward<Default>(x.value);
325 template <typename KW, typename F>
326 inline BOOST_CONSTEXPR
327 typename ::boost::parameter::aux::result_of0<F>::type
329 ::boost::parameter::aux::lazy_default<KW,F> const& x
332 return x.compute_default();
335 template <typename ParameterRequirements>
336 static BOOST_CONSTEXPR typename ParameterRequirements::has_default
337 satisfies(ParameterRequirements*);
339 template <typename HasDefault, typename Predicate>
340 static BOOST_CONSTEXPR
341 typename ::boost::mpl::apply_wrap1<Predicate,value_type>::type
343 ::boost::parameter::aux::parameter_requirements<
350 // MPL sequence support
351 // Convenience for users
352 typedef ::boost::parameter::aux::tagged_argument<Keyword,Arg> type;
353 // For the benefit of iterators
354 typedef ::boost::parameter::aux::empty_arg_list tail_type;
355 // For dispatching to sequence intrinsics
356 typedef ::boost::parameter::aux::arg_list_tag tag;
359 #if defined(BOOST_PARAMETER_CAN_USE_MP11)
360 template <typename Keyword>
361 using tagged_argument_rref_key = ::boost::mp11::mp_if<
363 typename Keyword::qualifier
364 , ::boost::parameter::out_reference
366 , ::boost::parameter::aux::error_rvalue_bound_to_out_parameter
367 , ::boost::mp11::mp_identity<Keyword>
371 // Holds an rvalue reference to an argument of type Arg associated with
373 template <typename Keyword, typename Arg>
374 struct tagged_argument_rref
375 : ::boost::parameter::aux::tagged_argument_base
377 #if defined(BOOST_PARAMETER_CAN_USE_MP11)
378 using key_type = typename ::boost::parameter::aux
379 ::tagged_argument_rref_key<Keyword>::type;
381 typedef typename ::boost::mpl::eval_if<
383 typename Keyword::qualifier
384 , ::boost::parameter::out_reference
386 , ::boost::parameter::aux::error_rvalue_bound_to_out_parameter
387 , ::boost::mpl::identity<Keyword>
390 typedef Arg value_type;
391 typedef Arg&& reference;
397 inline explicit BOOST_CONSTEXPR tagged_argument_rref(reference x)
398 : value(::std::forward<Arg>(x))
402 inline BOOST_CONSTEXPR tagged_argument_rref(
403 tagged_argument_rref const& copy
404 ) : value(::std::forward<Arg>(copy.value))
408 // A metafunction class that, given a keyword and a default type,
409 // returns the appropriate result type for a keyword lookup given
413 template <typename KW, typename Default, typename Reference>
416 typedef typename ::boost::mpl::eval_if<
417 ::boost::is_same<KW,key_type>
418 , ::boost::mpl::if_<Reference,reference,value_type>
419 , ::boost::mpl::identity<Default>
423 #if defined(BOOST_PARAMETER_CAN_USE_MP11)
424 template <typename KW, typename Default, typename Reference>
425 using fn = ::boost::mp11::mp_if<
426 ::std::is_same<KW,key_type>
427 , ::boost::mp11::mp_if<Reference,reference,value_type>
433 #if !defined(BOOST_PARAMETER_CAN_USE_MP11)
434 // Comma operator to compose argument list without using parameters<>.
435 // Useful for argument lists with undetermined length.
436 template <typename Keyword2, typename Arg2>
437 inline BOOST_CONSTEXPR ::boost::parameter::aux::arg_list<
438 ::boost::parameter::aux::tagged_argument_rref<Keyword,Arg>
439 , ::boost::parameter::aux::arg_list<
440 ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
444 ::boost::parameter::aux
445 ::tagged_argument<Keyword2,Arg2> const& x
448 return boost::parameter::aux::arg_list<
449 ::boost::parameter::aux::tagged_argument_rref<Keyword,Arg>
450 , ::boost::parameter::aux::arg_list<
451 ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
455 , ::boost::parameter::aux::arg_list<
456 ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
457 >(x, ::boost::parameter::aux::empty_arg_list())
461 template <typename Keyword2, typename Arg2>
462 inline BOOST_CONSTEXPR ::boost::parameter::aux::arg_list<
463 ::boost::parameter::aux::tagged_argument_rref<Keyword,Arg>
464 , ::boost::parameter::aux::arg_list<
465 ::boost::parameter::aux::tagged_argument_rref<Keyword2,Arg2>
469 ::boost::parameter::aux
470 ::tagged_argument_rref<Keyword2,Arg2> const& x
473 return ::boost::parameter::aux::arg_list<
474 ::boost::parameter::aux::tagged_argument_rref<Keyword,Arg>
475 , ::boost::parameter::aux::arg_list<
476 ::boost::parameter::aux
477 ::tagged_argument_rref<Keyword2,Arg2>
481 , ::boost::parameter::aux::arg_list<
482 ::boost::parameter::aux::tagged_argument_rref<
486 >(x, ::boost::parameter::aux::empty_arg_list())
489 #endif // BOOST_PARAMETER_CAN_USE_MP11
491 // Accessor interface.
492 inline BOOST_CONSTEXPR reference get_value() const
494 return ::std::forward<Arg>(this->value);
497 inline BOOST_CONSTEXPR reference
498 operator[](::boost::parameter::keyword<Keyword> const&) const
500 return this->get_value();
503 template <typename Default>
504 inline BOOST_CONSTEXPR reference
506 ::boost::parameter::aux::default_<key_type,Default> const&
509 return this->get_value();
512 template <typename Default>
513 inline BOOST_CONSTEXPR reference
515 ::boost::parameter::aux::default_r_<key_type,Default> const&
518 return this->get_value();
521 template <typename F>
522 inline BOOST_CONSTEXPR reference
524 ::boost::parameter::aux::lazy_default<key_type,F> const&
527 return this->get_value();
530 template <typename KW, typename Default>
531 inline BOOST_CONSTEXPR Default&
533 ::boost::parameter::aux::default_<KW,Default> const& x
539 template <typename KW, typename Default>
540 inline BOOST_CONSTEXPR Default&&
542 ::boost::parameter::aux::default_r_<KW,Default> const& x
545 return ::std::forward<Default>(x.value);
548 template <typename KW, typename F>
549 inline BOOST_CONSTEXPR
550 typename ::boost::parameter::aux::result_of0<F>::type
552 ::boost::parameter::aux::lazy_default<KW,F> const& x
555 return x.compute_default();
558 template <typename ParameterRequirements>
559 static BOOST_CONSTEXPR typename ParameterRequirements::has_default
560 satisfies(ParameterRequirements*);
562 template <typename HasDefault, typename Predicate>
563 static BOOST_CONSTEXPR
564 typename ::boost::mpl::apply_wrap1<Predicate,value_type>::type
566 ::boost::parameter::aux::parameter_requirements<
573 // MPL sequence support
574 // Convenience for users
575 typedef ::boost::parameter::aux
576 ::tagged_argument_rref<Keyword,Arg> type;
577 // For the benefit of iterators
578 typedef ::boost::parameter::aux::empty_arg_list tail_type;
579 // For dispatching to sequence intrinsics
580 typedef ::boost::parameter::aux::arg_list_tag tag;
582 }}} // namespace boost::parameter::aux
584 #else // !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
586 namespace boost { namespace parameter { namespace aux {
588 // Holds an lvalue reference to an argument of type Arg associated with
590 template <typename Keyword, typename Arg>
591 class tagged_argument
592 : public ::boost::parameter::aux::tagged_argument_base
594 typedef typename ::boost::remove_const<Arg>::type arg_type;
597 typedef Keyword key_type;
599 // Wrap plain (non-UDT) function objects in either
600 // a boost::function or a std::function. -- Cromwell D. Enage
601 typedef typename ::boost::mpl::if_<
602 ::boost::is_function<arg_type>
603 #if defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
604 , ::boost::function<arg_type>
606 , ::std::function<arg_type>
611 // If Arg is void_, then this type will evaluate to void_&. If the
612 // supplied argument is a plain function, then this type will evaluate
613 // to a reference-to-const function wrapper type. If the supplied
614 // argument is an lvalue, then Arg will be deduced to the lvalue
615 // reference. -- Cromwell D. Enage
616 typedef typename ::boost::mpl::if_<
617 ::boost::is_function<arg_type>
623 // Store plain functions by value, everything else by reference.
624 // -- Cromwell D. Enage
625 typename ::boost::mpl::if_<
626 ::boost::is_function<arg_type>
632 inline explicit BOOST_CONSTEXPR tagged_argument(reference x)
637 inline BOOST_CONSTEXPR tagged_argument(tagged_argument const& copy)
642 // A metafunction class that, given a keyword and a default type,
643 // returns the appropriate result type for a keyword lookup given
647 template <typename KW, typename Default, typename Reference>
650 typedef typename ::boost::mpl::eval_if<
651 ::boost::is_same<KW,key_type>
652 , ::boost::mpl::if_<Reference,reference,value_type>
653 , ::boost::mpl::identity<Default>
658 // Comma operator to compose argument list without using parameters<>.
659 // Useful for argument lists with undetermined length.
660 template <typename Keyword2, typename Arg2>
661 inline ::boost::parameter::aux::arg_list<
662 ::boost::parameter::aux::tagged_argument<Keyword,Arg>
663 , ::boost::parameter::aux::arg_list<
664 ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
668 ::boost::parameter::aux
669 ::tagged_argument<Keyword2,Arg2> const& x
672 return ::boost::parameter::aux::arg_list<
673 ::boost::parameter::aux::tagged_argument<Keyword,Arg>
674 , ::boost::parameter::aux::arg_list<
675 ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
679 , ::boost::parameter::aux::arg_list<
680 ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
681 >(x, ::boost::parameter::aux::empty_arg_list())
685 // Accessor interface.
686 inline BOOST_CONSTEXPR reference get_value() const
691 inline BOOST_CONSTEXPR reference
692 operator[](::boost::parameter::keyword<Keyword> const&) const
694 return this->get_value();
697 #if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) || \
698 BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
699 template <typename KW, typename Default>
700 inline BOOST_CONSTEXPR Default&
702 ::boost::parameter::aux::default_<KW,Default> const& x
709 template <typename Default>
710 inline BOOST_CONSTEXPR reference
712 ::boost::parameter::aux::default_<key_type,Default> const&
716 return this->get_value();
719 template <typename KW, typename Default>
720 inline BOOST_CONSTEXPR typename ::boost::mpl::apply_wrap3<
724 , ::boost::mpl::true_
727 ::boost::parameter::aux::default_<KW,Default> const& x
730 return this->get_with_default(x, 0L);
733 template <typename KW, typename F>
734 inline BOOST_CONSTEXPR
735 typename ::boost::parameter::aux::result_of0<F>::type
736 get_with_lazy_default(
737 ::boost::parameter::aux::lazy_default<KW,F> const& x
741 return x.compute_default();
744 template <typename F>
745 inline BOOST_CONSTEXPR reference
746 get_with_lazy_default(
747 ::boost::parameter::aux::lazy_default<key_type,F> const&
751 return this->get_value();
754 template <typename KW, typename F>
755 inline BOOST_CONSTEXPR typename ::boost::mpl::apply_wrap3<
758 , typename ::boost::parameter::aux::result_of0<F>::type
759 , ::boost::mpl::true_
762 ::boost::parameter::aux::lazy_default<KW,F> const& x
765 return this->get_with_lazy_default(x, 0L);
767 #else // No function template ordering or Borland workarounds needed.
768 template <typename Default>
769 inline BOOST_CONSTEXPR reference
771 ::boost::parameter::aux::default_<key_type,Default> const&
774 return this->get_value();
777 template <typename F>
778 inline BOOST_CONSTEXPR reference
780 ::boost::parameter::aux::lazy_default<key_type,F> const&
783 return this->get_value();
786 template <typename KW, typename Default>
787 inline BOOST_CONSTEXPR Default&
789 ::boost::parameter::aux::default_<KW,Default> const& x
795 template <typename KW, typename F>
796 inline BOOST_CONSTEXPR
797 typename ::boost::parameter::aux::result_of0<F>::type
799 ::boost::parameter::aux::lazy_default<KW,F> const& x
802 return x.compute_default();
805 template <typename ParameterRequirements>
806 static BOOST_CONSTEXPR typename ParameterRequirements::has_default
807 satisfies(ParameterRequirements*);
809 template <typename HasDefault, typename Predicate>
810 static BOOST_CONSTEXPR
811 typename ::boost::mpl::apply_wrap1<Predicate,value_type>::type
813 ::boost::parameter::aux::parameter_requirements<
819 #endif // Function template ordering, Borland workarounds needed.
821 // MPL sequence support
822 // Convenience for users
823 typedef ::boost::parameter::aux::tagged_argument<Keyword,Arg> type;
824 // For the benefit of iterators
825 typedef ::boost::parameter::aux::empty_arg_list tail_type;
826 // For dispatching to sequence intrinsics
827 typedef ::boost::parameter::aux::arg_list_tag tag;
829 #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
830 // warning suppression
832 void operator=(type const&);
835 }}} // namespace boost::parameter::aux
837 #endif // BOOST_PARAMETER_HAS_PERFECT_FORWARDING
839 #if defined(BOOST_PARAMETER_CAN_USE_MP11)
841 namespace boost { namespace parameter { namespace aux {
843 template <typename TaggedArg>
844 struct tagged_argument_list_of_1 : public TaggedArg
846 using base_type = TaggedArg;
848 inline explicit BOOST_CONSTEXPR tagged_argument_list_of_1(
849 typename base_type::reference x
850 ) : base_type(static_cast<typename base_type::reference>(x))
854 inline BOOST_CONSTEXPR tagged_argument_list_of_1(
855 tagged_argument_list_of_1 const& copy
856 ) : base_type(static_cast<base_type const&>(copy))
860 using base_type::operator[];
861 using base_type::satisfies;
863 template <typename TA2>
864 inline BOOST_CONSTEXPR ::boost::parameter::aux::flat_like_arg_list<
865 ::boost::parameter::aux
866 ::flat_like_arg_tuple<typename TaggedArg::key_type,TaggedArg>
867 , ::boost::parameter::aux::flat_like_arg_tuple<
868 typename TA2::base_type::key_type
869 , typename TA2::base_type
872 operator,(TA2 const& x) const
874 return boost::parameter::aux::flat_like_arg_list<
875 ::boost::parameter::aux
876 ::flat_like_arg_tuple<typename TaggedArg::key_type,TaggedArg>
877 , ::boost::parameter::aux::flat_like_arg_tuple<
878 typename TA2::base_type::key_type
879 , typename TA2::base_type
882 static_cast<base_type const&>(*this)
883 , ::boost::parameter::aux::arg_list<typename TA2::base_type>(
884 static_cast<typename TA2::base_type const&>(x)
885 , ::boost::parameter::aux::empty_arg_list()
890 }}} // namespace boost::parameter::aux
892 #endif // BOOST_PARAMETER_CAN_USE_MP11
893 #endif // include guard