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)
6
7#ifndef BOOST_PARAMETER_KEYWORD_HPP
8#define BOOST_PARAMETER_KEYWORD_HPP
9
10#include <boost/parameter/aux_/tag.hpp>
11#include <boost/parameter/aux_/default.hpp>
12#include <boost/parameter/keyword_fwd.hpp>
13#include <boost/parameter/config.hpp>
14
15#if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
16#include <boost/core/enable_if.hpp>
17#include <utility>
18
19#if defined(BOOST_PARAMETER_CAN_USE_MP11)
20#include <boost/mp11/integral.hpp>
21#include <boost/mp11/utility.hpp>
22#include <type_traits>
23#else
24#include <boost/mpl/bool.hpp>
25#include <boost/mpl/if.hpp>
26#include <boost/mpl/eval_if.hpp>
27#include <boost/type_traits/is_same.hpp>
28#include <boost/type_traits/is_scalar.hpp>
29#include <boost/type_traits/is_const.hpp>
30#endif
31
32namespace boost { namespace parameter {
33
34 // Instances of unique specializations of keyword<...> serve to
35 // associate arguments with parameter names. For example:
36 //
37 // struct rate_; // parameter names
38 // struct skew_;
39 //
40 // namespace
41 // {
42 // keyword<rate_> rate; // keywords
43 // keyword<skew_> skew;
44 // }
45 //
46 // ...
47 //
48 // f(rate = 1, skew = 2.4);
49 template <typename Tag>
50 struct keyword
51 {
52 typedef Tag tag;
53
54 inline BOOST_CONSTEXPR keyword()
55 {
56 }
57
58 template <typename T>
59 inline BOOST_CONSTEXPR typename ::boost::lazy_enable_if<
60#if defined(BOOST_PARAMETER_CAN_USE_MP11)
61 ::boost::mp11::mp_if<
62 ::std::is_scalar<T>
63 , ::boost::mp11::mp_true
64 , ::boost::mp11::mp_if<
65 ::std::is_same<
66 typename Tag::qualifier
67 , ::boost::parameter::in_reference
68 >
69 , ::boost::mp11::mp_true
70 , ::std::is_same<
71 typename Tag::qualifier
72 , ::boost::parameter::forward_reference
73 >
74 >
75 >
76#else // !defined(BOOST_PARAMETER_CAN_USE_MP11)
77 typename ::boost::mpl::eval_if<
78 ::boost::is_scalar<T>
79 , ::boost::mpl::true_
80 , ::boost::mpl::eval_if<
81 ::boost::is_same<
82 typename Tag::qualifier
83 , ::boost::parameter::in_reference
84 >
85 , ::boost::mpl::true_
86 , ::boost::mpl::if_<
87 ::boost::is_same<
88 typename Tag::qualifier
89 , ::boost::parameter::forward_reference
90 >
91 , ::boost::mpl::true_
92 , ::boost::mpl::false_
93 >
94 >
95 >::type
96#endif // BOOST_PARAMETER_CAN_USE_MP11
97 , ::boost::parameter::aux::tag<Tag,T const&>
98 >::type
99 operator=(T const& x) const
100 {
101 typedef typename ::boost::parameter::aux
102 ::tag<Tag,T const&>::type result;
103 return result(x);
104 }
105
106 template <typename Default>
107 inline BOOST_CONSTEXPR typename ::boost::enable_if<
108#if defined(BOOST_PARAMETER_CAN_USE_MP11)
109 ::boost::mp11::mp_if<
110 ::std::is_scalar<Default>
111 , ::boost::mp11::mp_true
112 , ::boost::mp11::mp_if<
113 ::std::is_same<
114 typename Tag::qualifier
115 , ::boost::parameter::in_reference
116 >
117 , ::boost::mp11::mp_true
118 , ::std::is_same<
119 typename Tag::qualifier
120 , ::boost::parameter::forward_reference
121 >
122 >
123 >
124#else // !defined(BOOST_PARAMETER_CAN_USE_MP11)
125 typename ::boost::mpl::eval_if<
126 ::boost::is_scalar<Default>
127 , ::boost::mpl::true_
128 , ::boost::mpl::eval_if<
129 ::boost::is_same<
130 typename Tag::qualifier
131 , ::boost::parameter::in_reference
132 >
133 , ::boost::mpl::true_
134 , ::boost::mpl::if_<
135 ::boost::is_same<
136 typename Tag::qualifier
137 , ::boost::parameter::forward_reference
138 >
139 , ::boost::mpl::true_
140 , ::boost::mpl::false_
141 >
142 >
143 >::type
144#endif // BOOST_PARAMETER_CAN_USE_MP11
145 , ::boost::parameter::aux::default_<Tag,Default const>
146 >::type
147 operator|(Default const& d) const
148 {
149 return ::boost::parameter::aux::default_<Tag,Default const>(d);
150 }
151
152 template <typename T>
153 inline BOOST_CONSTEXPR typename ::boost::lazy_enable_if<
154#if defined(BOOST_PARAMETER_CAN_USE_MP11)
155 ::boost::mp11::mp_if<
156 ::boost::mp11::mp_if<
157 ::std::is_same<
158 typename Tag::qualifier
159 , ::boost::parameter::out_reference
160 >
161 , ::boost::mp11::mp_true
162 , ::std::is_same<
163 typename Tag::qualifier
164 , ::boost::parameter::forward_reference
165 >
166 >
167 , ::boost::mp11::mp_if<
168 ::std::is_const<T>
169 , ::boost::mp11::mp_false
170 , ::boost::mp11::mp_true
171 >
172 , ::boost::mp11::mp_false
173 >
174#else // !defined(BOOST_PARAMETER_CAN_USE_MP11)
175 typename ::boost::mpl::eval_if<
176 typename ::boost::mpl::if_<
177 ::boost::is_same<
178 typename Tag::qualifier
179 , ::boost::parameter::out_reference
180 >
181 , ::boost::mpl::true_
182 , ::boost::is_same<
183 typename Tag::qualifier
184 , ::boost::parameter::forward_reference
185 >
186 >::type
187 , ::boost::mpl::if_<
188 ::boost::is_const<T>
189 , ::boost::mpl::false_
190 , ::boost::mpl::true_
191 >
192 , ::boost::mpl::false_
193 >::type
194#endif // BOOST_PARAMETER_CAN_USE_MP11
195 , ::boost::parameter::aux::tag<Tag,T&>
196 >::type
197 operator=(T& x) const
198 {
199 typedef typename ::boost::parameter::aux
200 ::tag<Tag,T&>::type result;
201 return result(x);
202 }
203
204 template <typename Default>
205 inline BOOST_CONSTEXPR typename ::boost::enable_if<
206#if defined(BOOST_PARAMETER_CAN_USE_MP11)
207 ::boost::mp11::mp_if<
208 ::boost::mp11::mp_if<
209 ::std::is_same<
210 typename Tag::qualifier
211 , ::boost::parameter::out_reference
212 >
213 , ::boost::mp11::mp_true
214 , ::std::is_same<
215 typename Tag::qualifier
216 , ::boost::parameter::forward_reference
217 >
218 >
219 , ::boost::mp11::mp_if<
220 ::std::is_const<Default>
221 , ::boost::mp11::mp_false
222 , ::boost::mp11::mp_true
223 >
224 , ::boost::mp11::mp_false
225 >
226#else // !defined(BOOST_PARAMETER_CAN_USE_MP11)
227 typename ::boost::mpl::eval_if<
228 typename ::boost::mpl::if_<
229 ::boost::is_same<
230 typename Tag::qualifier
231 , ::boost::parameter::out_reference
232 >
233 , ::boost::mpl::true_
234 , ::boost::is_same<
235 typename Tag::qualifier
236 , ::boost::parameter::forward_reference
237 >
238 >::type
239 , ::boost::mpl::if_<
240 ::boost::is_const<Default>
241 , ::boost::mpl::false_
242 , ::boost::mpl::true_
243 >
244 , ::boost::mpl::false_
245 >::type
246#endif // BOOST_PARAMETER_CAN_USE_MP11
247 , ::boost::parameter::aux::default_<Tag,Default>
248 >::type
249 operator|(Default& d) const
250 {
251 return ::boost::parameter::aux::default_<Tag,Default>(d);
252 }
253
254 template <typename Default>
255 inline BOOST_CONSTEXPR
256 ::boost::parameter::aux::lazy_default<Tag,Default const>
257 operator||(Default const& d) const
258 {
259 return ::boost::parameter::aux
260 ::lazy_default<Tag,Default const>(d);
261 }
262
263 template <typename Default>
264 inline BOOST_CONSTEXPR
265 ::boost::parameter::aux::lazy_default<Tag,Default>
266 operator||(Default& d) const
267 {
268 return ::boost::parameter::aux::lazy_default<Tag,Default>(d);
269 }
270
271 template <typename T>
272 inline BOOST_CONSTEXPR typename ::boost::lazy_enable_if<
273#if defined(BOOST_PARAMETER_CAN_USE_MP11)
274 ::boost::mp11::mp_if<
275 ::std::is_scalar<T>
276 , ::boost::mp11::mp_false
277 , ::boost::mp11::mp_if<
278 ::std::is_same<
279 typename Tag::qualifier
280 , ::boost::parameter::in_reference
281 >
282 , ::boost::mp11::mp_true
283 , ::std::is_same<
284 typename Tag::qualifier
285 , ::boost::parameter::forward_reference
286 >
287 >
288 >
289#else // !defined(BOOST_PARAMETER_CAN_USE_MP11)
290 typename ::boost::mpl::eval_if<
291 ::boost::is_scalar<T>
292 , ::boost::mpl::false_
293 , ::boost::mpl::eval_if<
294 ::boost::is_same<
295 typename Tag::qualifier
296 , ::boost::parameter::in_reference
297 >
298 , ::boost::mpl::true_
299 , ::boost::mpl::if_<
300 ::boost::is_same<
301 typename Tag::qualifier
302 , ::boost::parameter::forward_reference
303 >
304 , ::boost::mpl::true_
305 , ::boost::mpl::false_
306 >
307 >
308 >::type
309#endif // BOOST_PARAMETER_CAN_USE_MP11
310 , ::boost::parameter::aux::tag<Tag,T const>
311 >::type
312 operator=(T const&& x) const
313 {
314 typedef typename ::boost::parameter::aux
315 ::tag<Tag,T const>::type result;
316 return result(::std::forward<T const>(x));
317 }
318
319 template <typename T>
320 inline BOOST_CONSTEXPR typename ::boost::lazy_enable_if<
321#if defined(BOOST_PARAMETER_CAN_USE_MP11)
322 ::boost::mp11::mp_if<
323 ::std::is_scalar<T>
324 , ::boost::mp11::mp_false
325 , ::boost::mp11::mp_if<
326 ::std::is_same<
327 typename Tag::qualifier
328 , ::boost::parameter::consume_reference
329 >
330 , ::boost::mp11::mp_true
331 , ::std::is_same<
332 typename Tag::qualifier
333 , ::boost::parameter::forward_reference
334 >
335 >
336 >
337#else // !defined(BOOST_PARAMETER_CAN_USE_MP11)
338 typename ::boost::mpl::eval_if<
339 ::boost::is_scalar<T>
340 , ::boost::mpl::false_
341 , ::boost::mpl::eval_if<
342 ::boost::is_same<
343 typename Tag::qualifier
344 , ::boost::parameter::consume_reference
345 >
346 , ::boost::mpl::true_
347 , ::boost::mpl::if_<
348 ::boost::is_same<
349 typename Tag::qualifier
350 , ::boost::parameter::forward_reference
351 >
352 , ::boost::mpl::true_
353 , ::boost::mpl::false_
354 >
355 >
356 >::type
357#endif // BOOST_PARAMETER_CAN_USE_MP11
358 , ::boost::parameter::aux::tag<Tag,T>
359 >::type
360 operator=(T&& x) const
361 {
362 typedef typename ::boost::parameter::aux::tag<Tag,T>::type result;
363 return result(::std::forward<T>(x));
364 }
365
366 template <typename Default>
367 inline BOOST_CONSTEXPR typename ::boost::enable_if<
368#if defined(BOOST_PARAMETER_CAN_USE_MP11)
369 ::boost::mp11::mp_if<
370 ::std::is_scalar<Default>
371 , ::boost::mp11::mp_false
372 , ::boost::mp11::mp_if<
373 ::std::is_same<
374 typename Tag::qualifier
375 , ::boost::parameter::in_reference
376 >
377 , ::boost::mp11::mp_true
378 , ::std::is_same<
379 typename Tag::qualifier
380 , ::boost::parameter::forward_reference
381 >
382 >
383 >
384#else // !defined(BOOST_PARAMETER_CAN_USE_MP11)
385 typename ::boost::mpl::eval_if<
386 ::boost::is_scalar<Default>
387 , ::boost::mpl::false_
388 , ::boost::mpl::eval_if<
389 ::boost::is_same<
390 typename Tag::qualifier
391 , ::boost::parameter::in_reference
392 >
393 , ::boost::mpl::true_
394 , ::boost::mpl::if_<
395 ::boost::is_same<
396 typename Tag::qualifier
397 , ::boost::parameter::forward_reference
398 >
399 , ::boost::mpl::true_
400 , ::boost::mpl::false_
401 >
402 >
403 >::type
404#endif // BOOST_PARAMETER_CAN_USE_MP11
405 , ::boost::parameter::aux::default_r_<Tag,Default const>
406 >::type
407 operator|(Default const&& d) const
408 {
409 return ::boost::parameter::aux::default_r_<Tag,Default const>(
410 ::std::forward<Default const>(d)
411 );
412 }
413
414 template <typename Default>
415 inline BOOST_CONSTEXPR typename ::boost::enable_if<
416#if defined(BOOST_PARAMETER_CAN_USE_MP11)
417 ::boost::mp11::mp_if<
418 ::std::is_scalar<Default>
419 , ::boost::mp11::mp_false
420 , ::boost::mp11::mp_if<
421 ::std::is_same<
422 typename Tag::qualifier
423 , ::boost::parameter::consume_reference
424 >
425 , ::boost::mp11::mp_true
426 , ::std::is_same<
427 typename Tag::qualifier
428 , ::boost::parameter::forward_reference
429 >
430 >
431 >
432#else // !defined(BOOST_PARAMETER_CAN_USE_MP11)
433 typename ::boost::mpl::eval_if<
434 ::boost::is_scalar<Default>
435 , ::boost::mpl::false_
436 , ::boost::mpl::eval_if<
437 ::boost::is_same<
438 typename Tag::qualifier
439 , ::boost::parameter::consume_reference
440 >
441 , ::boost::mpl::true_
442 , ::boost::mpl::if_<
443 ::boost::is_same<
444 typename Tag::qualifier
445 , ::boost::parameter::forward_reference
446 >
447 , ::boost::mpl::true_
448 , ::boost::mpl::false_
449 >
450 >
451 >::type
452#endif // BOOST_PARAMETER_CAN_USE_MP11
453 , ::boost::parameter::aux::default_r_<Tag,Default>
454 >::type
455 operator|(Default&& d) const
456 {
457 return ::boost::parameter::aux
458 ::default_r_<Tag,Default>(::std::forward<Default>(d));
459 }
460
461 public: // Insurance against ODR violations
462 // Users will need to define their keywords in header files. To
463 // prevent ODR violations, it's important that the keyword used in
464 // every instantiation of a function template is the same object.
465 // We provide a reference to a common instance of each keyword
466 // object and prevent construction by users.
467 static ::boost::parameter::keyword<Tag> const instance;
468
469 // This interface is deprecated.
470 static ::boost::parameter::keyword<Tag>& get()
471 {
472 return const_cast< ::boost::parameter::keyword<Tag>&>(instance);
473 }
474 };
475
476 template <typename Tag>
477 ::boost::parameter::keyword<Tag> const ::boost::parameter
478 ::keyword<Tag>::instance = ::boost::parameter::keyword<Tag>();
479}} // namespace boost::parameter
480
481#else // !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
482
483#if !defined(BOOST_NO_SFINAE)
484#include <boost/mpl/bool.hpp>
485#include <boost/mpl/if.hpp>
486#include <boost/mpl/eval_if.hpp>
487#include <boost/core/enable_if.hpp>
488#include <boost/type_traits/is_same.hpp>
489#include <boost/type_traits/is_scalar.hpp>
490#include <boost/type_traits/is_const.hpp>
491#endif // BOOST_NO_SFINAE
492
493namespace boost { namespace parameter {
494
495 // Instances of unique specializations of keyword<...> serve to
496 // associate arguments with parameter names. For example:
497 //
498 // struct rate_; // parameter names
499 // struct skew_;
500 //
501 // namespace
502 // {
503 // keyword<rate_> rate; // keywords
504 // keyword<skew_> skew;
505 // }
506 //
507 // ...
508 //
509 // f(rate = 1, skew = 2.4);
510 template <typename Tag>
511 struct keyword
512 {
513 typedef Tag tag;
514
515 inline BOOST_CONSTEXPR keyword()
516 {
517 }
518
519 template <typename T>
520#if defined(BOOST_NO_SFINAE)
521 inline typename ::boost::parameter::aux::tag<Tag,T const&>::type
522#else
523 inline BOOST_CONSTEXPR typename ::boost::lazy_enable_if<
524 typename ::boost::mpl::eval_if<
525 ::boost::is_scalar<T>
526 , ::boost::mpl::true_
527 , ::boost::mpl::eval_if<
528 ::boost::is_same<
529 typename Tag::qualifier
530 , ::boost::parameter::in_reference
531 >
532 , ::boost::mpl::true_
533 , ::boost::mpl::if_<
534 ::boost::is_same<
535 typename Tag::qualifier
536 , ::boost::parameter::forward_reference
537 >
538 , ::boost::mpl::true_
539 , ::boost::mpl::false_
540 >
541 >
542 >::type
543 , ::boost::parameter::aux::tag<Tag,T const&>
544 >::type
545#endif // BOOST_NO_SFINAE
546 operator=(T const& x) const
547 {
548 typedef typename ::boost::parameter::aux
549 ::tag<Tag,T const&>::type result;
550 return result(x);
551 }
552
553 template <typename Default>
554#if defined(BOOST_NO_SFINAE)
555 inline ::boost::parameter::aux::default_<Tag,Default const>
556#else
557 inline BOOST_CONSTEXPR typename ::boost::enable_if<
558 typename ::boost::mpl::eval_if<
559 ::boost::is_scalar<Default>
560 , ::boost::mpl::true_
561 , ::boost::mpl::eval_if<
562 ::boost::is_same<
563 typename Tag::qualifier
564 , ::boost::parameter::in_reference
565 >
566 , ::boost::mpl::true_
567 , ::boost::mpl::if_<
568 ::boost::is_same<
569 typename Tag::qualifier
570 , ::boost::parameter::forward_reference
571 >
572 , ::boost::mpl::true_
573 , ::boost::mpl::false_
574 >
575 >
576 >::type
577 , ::boost::parameter::aux::default_<Tag,Default const>
578 >::type
579#endif // BOOST_NO_SFINAE
580 operator|(Default const& d) const
581 {
582 return ::boost::parameter::aux::default_<Tag,Default const>(d);
583 }
584
585 template <typename T>
586#if defined(BOOST_NO_SFINAE)
587 inline typename ::boost::parameter::aux::tag<Tag,T&>::type
588#else
589 inline BOOST_CONSTEXPR typename ::boost::lazy_enable_if<
590 typename ::boost::mpl::eval_if<
591 typename ::boost::mpl::if_<
592 ::boost::is_same<
593 typename Tag::qualifier
594 , ::boost::parameter::out_reference
595 >
596 , ::boost::mpl::true_
597 , ::boost::is_same<
598 typename Tag::qualifier
599 , ::boost::parameter::forward_reference
600 >
601 >::type
602 , ::boost::mpl::if_<
603 ::boost::is_const<T>
604 , ::boost::mpl::false_
605 , ::boost::mpl::true_
606 >
607 , ::boost::mpl::false_
608 >::type
609 , ::boost::parameter::aux::tag<Tag,T&>
610 >::type
611#endif // BOOST_NO_SFINAE
612 operator=(T& x) const
613 {
614 typedef typename ::boost::parameter::aux
615 ::tag<Tag,T&>::type result;
616 return result(x);
617 }
618
619 template <typename Default>
620#if defined(BOOST_NO_SFINAE)
621 inline ::boost::parameter::aux::default_<Tag,Default>
622#else
623 inline BOOST_CONSTEXPR typename ::boost::enable_if<
624 typename ::boost::mpl::eval_if<
625 typename ::boost::mpl::if_<
626 ::boost::is_same<
627 typename Tag::qualifier
628 , ::boost::parameter::out_reference
629 >
630 , ::boost::mpl::true_
631 , ::boost::is_same<
632 typename Tag::qualifier
633 , ::boost::parameter::forward_reference
634 >
635 >::type
636 , ::boost::mpl::if_<
637 ::boost::is_const<Default>
638 , ::boost::mpl::false_
639 , ::boost::mpl::true_
640 >
641 , ::boost::mpl::false_
642 >::type
643 , ::boost::parameter::aux::default_<Tag,Default>
644 >::type
645#endif // BOOST_NO_SFINAE
646 operator|(Default& d) const
647 {
648 return ::boost::parameter::aux::default_<Tag,Default>(d);
649 }
650
651 template <typename Default>
652 inline BOOST_CONSTEXPR
653 ::boost::parameter::aux::lazy_default<Tag,Default const>
654 operator||(Default const& d) const
655 {
656 return ::boost::parameter::aux
657 ::lazy_default<Tag,Default const>(d);
658 }
659
660 template <typename Default>
661 inline BOOST_CONSTEXPR
662 ::boost::parameter::aux::lazy_default<Tag,Default>
663 operator||(Default& d) const
664 {
665 return ::boost::parameter::aux::lazy_default<Tag,Default>(d);
666 }
667
668 public: // Insurance against ODR violations
669 // Users will need to define their keywords in header files. To
670 // prevent ODR violations, it's important that the keyword used in
671 // every instantiation of a function template is the same object.
672 // We provide a reference to a common instance of each keyword
673 // object and prevent construction by users.
674 static ::boost::parameter::keyword<Tag> const instance;
675
676 // This interface is deprecated.
677 static ::boost::parameter::keyword<Tag>& get()
678 {
679 return const_cast< ::boost::parameter::keyword<Tag>&>(instance);
680 }
681 };
682
683 template <typename Tag>
684 ::boost::parameter::keyword<Tag> const ::boost::parameter
685 ::keyword<Tag>::instance = ::boost::parameter::keyword<Tag>();
686}} // namespace boost::parameter
687
688#endif // BOOST_PARAMETER_HAS_PERFECT_FORWARDING
689
690#include <boost/parameter/aux_/name.hpp>
691#include <boost/preprocessor/stringize.hpp>
692
693// Reduces boilerplate required to declare and initialize keywords without
694// violating ODR. Declares a keyword tag type with the given name in
695// namespace tag_namespace, and declares and initializes a reference in an
696// anonymous namespace to a singleton instance of that type.
697#if defined(BOOST_PARAMETER_CAN_USE_MP11)
698#define BOOST_PARAMETER_KEYWORD(tag_namespace, name) \
699 namespace tag_namespace \
700 { \
701 struct name \
702 { \
703 static BOOST_CONSTEXPR char const* keyword_name() \
704 { \
705 return BOOST_PP_STRINGIZE(name); \
706 } \
707 using _ = BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE(name); \
708 using _1 = _; \
709 BOOST_PARAMETER_TAG_MP11_PLACEHOLDER_BINDING(binding_fn, name); \
710 BOOST_PARAMETER_TAG_MP11_PLACEHOLDER_VALUE(fn, name); \
711 using qualifier = ::boost::parameter::forward_reference; \
712 }; \
713 } \
714 namespace \
715 { \
716 ::boost::parameter::keyword<tag_namespace::name> const& name \
717 = ::boost::parameter::keyword<tag_namespace::name>::instance; \
718 }
719/**/
720#else // !defined(BOOST_PARAMETER_CAN_USE_MP11)
721#define BOOST_PARAMETER_KEYWORD(tag_namespace, name) \
722 namespace tag_namespace \
723 { \
724 struct name \
725 { \
726 static BOOST_CONSTEXPR char const* keyword_name() \
727 { \
728 return BOOST_PP_STRINGIZE(name); \
729 } \
730 typedef BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE(name) _; \
731 typedef BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE(name) _1; \
732 typedef ::boost::parameter::forward_reference qualifier; \
733 }; \
734 } \
735 namespace \
736 { \
737 ::boost::parameter::keyword<tag_namespace::name> const& name \
738 = ::boost::parameter::keyword<tag_namespace::name>::instance; \
739 }
740/**/
741#endif // BOOST_PARAMETER_CAN_USE_MP11
742
743#endif // include guard
744
745

source code of include/boost/parameter/keyword.hpp