1+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 The Boost Parameter Library Reference Documentation 3+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 5:Authors: David Abrahams, Daniel Wallin 6:Contact: dave@boost-consulting.com, daniel@boostpro.com 7:organization: `BoostPro Computing`_ 8:date: $Date: 2005/07/17 19:53:01 $ 9 10:copyright: Copyright David Abrahams, Daniel Wallin 11 2005-2009. Distributed under the Boost Software License, 12 Version 1.0. (See accompanying file LICENSE_1_0.txt 13 or copy at http://www.boost.org/LICENSE_1_0.txt) 14 15|(logo)|__ 16 17.. |(logo)| image:: ../../../../boost.png 18 :alt: Boost 19 20__ ../../../../index.htm 21 22.. _`BoostPro Computing`: http://www.boostpro.com 23 24 25////////////////////////////////////////////////////////////////////////////// 26 27.. contents:: 28 :depth: 2 29 30////////////////////////////////////////////////////////////////////////////// 31 32.. role:: class 33 :class: class 34 35.. role:: concept 36 :class: concept 37 38.. role:: function 39 :class: function 40 41.. |ArgumentPack| replace:: :concept:`ArgumentPack` 42.. |ForwardSequence| replace:: :concept:`Forward Sequence` 43.. |ParameterSpec| replace:: :concept:`ParameterSpec` 44 45.. role:: vellipsis 46 :class: vellipsis 47 48.. section-numbering:: 49 :depth: 2 50 51Preliminaries 52============= 53 54This section covers some basic information you'll need to know in 55order to understand this reference 56 57Namespaces 58---------- 59 60In this document, all unqualified identifiers should be assumed to 61be defined in namespace ``boost::parameter`` unless otherwise 62specified. 63 64Exceptions 65---------- 66 67No operation described in this document 68throws an exception unless otherwise specified. 69 70Thread Safety 71------------- 72 73All components of this library can be used safely from multiple 74threads without synchronization. [#thread]_ 75 76Typography 77---------- 78 79Names written in :concept:`sans serif type` represent concepts_. 80 81In code blocks, *italic type* represents unspecified text that 82satisfies the requirements given in the detailed description that 83follows the code block. 84 85In a specification of the tokens generated by a macro, **bold 86type** is used to highlight the position of the expanded macro 87argument in the result. 88 89The special character β represents the value of |BOOST_PARAMETER_MAX_ARITY|_. 90 91////////////////////////////////////////////////////////////////////////////// 92 93Terminology 94=========== 95 96.. |kw| replace:: keyword 97.. _kw: 98 99keyword 100 The name of a function parameter. 101 102.. _keyword tag type: 103.. |keyword tag type| replace:: `keyword tag type`_ 104 105keyword tag type 106 A type used to uniquely identify a function parameter. Typically 107 its name will be the same as that of the parameter. 108 109.. _positional: 110.. |positional| replace:: `positional`_ 111 112positional argument 113 An argument passed with no explicit |kw|. Its parameter is 114 determined in the usual C++ way: by position with respect to a 115 parameter list. 116 117.. _tag type: 118.. |tag type| replace:: `tag type`_ 119 120tag type 121 Shorthand for “\ |keyword tag type|.” 122 123.. _keyword object: 124.. |keyword object| replace:: `keyword object`_ 125 126keyword object 127 An instance of |keyword|_ ``<T>`` for some |tag 128 type| ``T``. 129 130.. _tagged reference: 131.. |tagged reference| replace:: `tagged reference`_ 132 133tagged reference 134 An object whose type is associated with a |keyword tag type| (the 135 object's *keyword*), and that holds a reference (to the object's 136 *value*). 137 138 As a shorthand, a “tagged reference to ``x``\ ” means a tagged 139 reference whose *value* is ``x``. 140 141.. _tagged default: 142.. |tagged default| replace:: `tagged default`_ 143 144tagged default 145 A |tagged reference| whose *value* represents the value of a 146 default argument. 147 148.. _tagged lazy default: 149.. |tagged lazy default| replace:: `tagged lazy default`_ 150 151tagged lazy default 152 A |tagged reference| whose *value*, when invoked with no 153 arguments, computes a default argument value. 154 155.. _intended argument type: 156.. |intended argument type| replace:: `intended argument type`_ 157 158intended argument type 159 The *intended argument type* of a single-element |ArgumentPack|_ is the 160 type of its element's *value*. The intended argument type of any other 161 type ``X`` is ``X`` itself. 162 163.. Note:: 164 165 In this reference, we will use concept names (and other names) 166 to describe both types and objects, depending on context. So 167 for example, “an |ArgumentPack|_\ ” can refer to a type that 168 models |ArgumentPack|_ *or* an object of such a type. 169 170////////////////////////////////////////////////////////////////////////////// 171 172Concepts 173======== 174 175This section describes the generic type concepts_ used by the Parameter library. 176 177.. _concepts: http://www.boost.org/more/generic_programming.html#concept 178 179|ArgumentPack| 180-------------- 181 182An |ArgumentPack| is a collection of |tagged reference|\ s to the 183actual arguments passed to a function. Every |ArgumentPack| is 184also a valid MPL |ForwardSequence|__ consisting of the |keyword tag 185type|\ s in its |tagged reference|\ s. 186 187__ ../../../mpl/doc/refmanual/forward-sequence.html 188 189Requirements 190............ 191 192In the table below, 193 194* ``A`` is a model of |ArgumentPack| 195* ``x`` is an instance of ``A`` 196* ``u`` is a |keyword object| of type ``K`` 197* ``v`` is a |tagged default| with |tag type| ``L`` and *value* of type ``D`` 198* ``w`` is a |tagged lazy default| with |tag type| ``M`` and *value* of type ``E const`` 199* ``z`` is an |ArgumentPack| containing a single element (as created by |keyword|_\ ``<…>::operator=``) 200 201Any exceptions are thrown from the invocation of ``w``\ 's *value* 202will be propagated to the caller. 203 204.. table:: |ArgumentPack| requirements 205 206 +----------+-----------------------------+------------------+--------------------------------------+ 207 |Expression| Type |Requirements |Semantics/Notes | 208 +==========+=============================+==================+======================================+ 209 |``x[u]`` |``binding<A,K>::type`` |``x`` contains an |Returns *b*\ 's *value* (by | 210 | | |element *b* whose |reference). | 211 | | ||kw|_ is ``K`` | | 212 +----------+-----------------------------+------------------+--------------------------------------+ 213 |``x[u]`` |``binding<A,L,D>::type`` |*none* |If ``x`` contains an element *b* whose| 214 | | | ||kw|_ is the same as ``u``\ 's, | 215 | | | |returns *b*\ 's *value* (by | 216 | | | |reference). Otherwise, returns ``u``\| 217 | | | |'s *value*. | 218 +----------+-----------------------------+------------------+--------------------------------------+ 219 |``x[w]`` |``lazy_binding<A,M,E>::type``|*none* |If ``x`` contains an element *b* whose| 220 | | | ||kw|_ is the same as ``w``\ 's, | 221 | | | |returns *b*\ 's *value* (by | 222 | | | |reference). Otherwise, invokes ``w``\| 223 | | | |'s *value* and returns the result. | 224 +----------+-----------------------------+------------------+--------------------------------------+ 225 |``x, z`` |Model of |ArgumentPack| |*none* |Returns an |ArgumentPack|_ containing | 226 | | | |all the elements of both ``x`` and | 227 | | | |``z``. | 228 +----------+-----------------------------+------------------+--------------------------------------+ 229 230 231 232.. _parameterspec: 233 234|ParameterSpec| 235--------------- 236 237A |ParameterSpec| describes the type requirements for arguments 238corresponding to a given |kw|_ and indicates whether the argument 239is optional or required. The table below details the allowed forms 240and describes their condition for satisfaction by an actual 241argument type. In each row, 242 243.. _conditions: 244 245* ``K`` is the |ParameterSpec|\ 's |keyword tag type| 246* ``A`` is an |intended argument type| associated with ``K``, if any 247* ``F`` is a unary `MPL lambda expression`_ 248 249.. _`MPL lambda expression`: ../../../mpl/doc/refmanual/lambda-expression.html 250 251.. table:: |ParameterSpec| allowed forms and conditions of satisfaction 252 253 +----------------------+--------------+--------------------------------+ 254 |Type |``A`` required|Condition ``A`` must satisfy | 255 +======================+==============+================================+ 256 |``K`` |no |*n/a* | 257 +----------------------+--------------+--------------------------------+ 258 ||optional|_\ ``<K,F>``|no |``mpl::apply<F,A>::type::value``| 259 | | |is ``true``. | 260 +----------------------+--------------+--------------------------------+ 261 ||required|_\ ``<K,F>``|yes |``mpl::apply<F,A>::type::value``| 262 | | |is ``true``. | 263 +----------------------+--------------+--------------------------------+ 264 265The information in a |ParameterSpec| is used to `limit`__ the 266arguments that will be matched by `forwarding functions`_. 267 268__ overloadcontrol_ 269.. _overloadcontrol: index.html#controlling-overload-resolution 270.. _forwarding functions: index.html#forwarding-functions 271 272 273////////////////////////////////////////////////////////////////////////////// 274 275Class Templates 276=============== 277 278.. |keyword| replace:: ``keyword`` 279.. _keyword: 280 281``keyword`` 282----------- 283 284The type of every |keyword object| is a specialization of |keyword|. 285 286:Defined in: `boost/parameter/keyword.hpp`__ 287 288__ ../../../../boost/parameter/keyword.hpp 289 290.. parsed-literal:: 291 292 template <class Tag> 293 struct keyword 294 { 295 template <class T> |ArgumentPack|_ `operator=`_\(T& value) const; 296 template <class T> |ArgumentPack|_ `operator=`_\(T const& value) const; 297 298 template <class T> *tagged default* `operator|`_\(T& x) const; 299 template <class T> *tagged default* `operator|`_\(T const& x) const; 300 301 template <class F> *tagged lazy default* `operator||`_\(F const&) const; 302 303 static keyword<Tag>& get_\(); 304 }; 305 306 307.. |operator=| replace:: ``operator=`` 308.. _operator=: 309 310``operator=`` 311 .. parsed-literal:: 312 313 template <class T> |ArgumentPack|_ operator=(T& value) const; 314 template <class T> |ArgumentPack|_ operator=(T const& value) const; 315 316 :Requires: nothing 317 318 :Returns: 319 an |ArgumentPack|_ containing a single |tagged reference| to 320 ``value`` with |kw|_ ``Tag`` 321 322.. _operator|: 323 324``operator|`` 325 .. parsed-literal:: 326 327 template <class T> *tagged default* operator|(T& x) const; 328 template <class T> *tagged default* operator|(T const& x) const; 329 330 :Returns: a |tagged default| with *value* ``x`` and |kw|_ ``Tag``. 331 332.. _operator||: 333 334``operator||`` 335 .. parsed-literal:: 336 337 template <class F> *tagged lazy default* operator||(F const& g) const; 338 339 :Requires: ``g()`` is valid, with type ``boost::``\ |result_of|_\ 340 ``<F()>::type``. [#no_result_of]_ 341 342 343 :Returns: a |tagged lazy default| with *value* ``g`` and |kw|_ ``Tag``. 344 345.. _get: 346 347``get`` 348 .. parsed-literal:: 349 350 static keyword<Tag>& get\(); 351 352 :Returns: a “singleton instance”: the same object will be 353 returned on each invocation of ``get()``. 354 355 :Thread Safety: ``get()`` can be called from multiple threads 356 simultaneously. 357 358``parameters`` 359-------------- 360 361Provides an interface for assembling the actual arguments to a 362`forwarding function` into an |ArgumentPack|, in which any 363|positional| arguments will be tagged according to the 364corresponding template argument to ``parameters``. 365 366.. _forwarding function: `forwarding functions`_ 367 368:Defined in: `boost/parameter/parameters.hpp`__ 369 370__ ../../../../boost/parameter/parameters.hpp 371 372.. parsed-literal:: 373 374 template <class P0 = *unspecified*, class P1 = *unspecified*, …class P\ β = *unspecified*> 375 struct parameters 376 { 377 template <class A0, class A1 = *unspecified*, …class A\ β = *unspecified*> 378 struct `match`_ 379 { 380 typedef … type; 381 }; 382 383 template <class A0> 384 |ArgumentPack|_ `operator()`_\(A0& a0) const; 385 386 template <class A0, class A1> 387 |ArgumentPack|_ `operator()`_\(A0& a0, A1& a1) const; 388 389 :vellipsis:`⋮` 390 391 template <class A0, class A1, …class A\ β> 392 |ArgumentPack|_ `operator()`_\(A0& a0, A1& a1, …A\ β& a\ β) const; 393 }; 394 395 396:Requires: ``P0``, ``P1``, … ``P``\ β are models of |ParameterSpec|_. 397 398 399.. Note:: 400 401 In this section, ``R``\ *i* and ``K``\ *i* are defined as 402 follows, for any argument type ``A``\ *i*: 403 404 405 | let ``D0`` the set [d0, …, d\ *j*] of all **deduced** *parameter specs* in [``P0``, …, ``P``\ β] 406 | ``R``\ *i* is ``A``\ *i*\ 's |intended argument type| 407 | 408 | if ``A``\ *i* is a result type of ``keyword<T>::``\ |operator=|_ 409 | then 410 | ``K``\ *i* is ``T`` 411 | else 412 | if some ``A``\ *j* where *j*\ ≤\ *i* is a result type of ``keyword<T>::``\ |operator=|_ 413 | *or* some ``P``\ *j* in *j*\ ≤\ *i* is **deduced** 414 | then 415 | if some *parameter spec* ``d``\ *j* in ``D``\ *i* matches ``A``\ *i* 416 | then 417 | ``K``\ *i* is ``d``\ *j*\ 's |keyword tag type|. 418 | ``D``\ :sub:`i+1` is ``D``\ *i* - [``d``\ *j*] 419 | else 420 | ``K``\ *i* is ``P``\ *i*\ 's |keyword tag type|. 421 422 423.. _match: 424 425``match`` 426 A |Metafunction|_ used to remove a `forwarding function`_ from overload resolution. 427 428 :Returns: if ``P0``, ``P1``, …\ ``P``\ β are *satisfied* (see 429 below), then ``parameters<P0,P1,…Pβ>``. Otherwise, 430 ``match<A0,A1,…Aβ>::type`` is not defined. 431 432 ``P0``, ``P1``, …\ ``P``\ β are **satisfied** if, for 433 every *j* in 0…β, either: 434 435 * ``P``\ *j* is the *unspecified* default 436 * **or**, ``P``\ *j* is a *keyword tag type* 437 438 * **or**, ``P``\ *j* is |optional|_ ``<X,F>`` and either 439 440 - ``X`` is not ``K``\ *i* for any *i*, 441 - **or** ``X`` is some ``K``\ *i* and ``mpl::apply<F,R``\ *i*\ 442 ``>::type::value`` is ``true`` 443 444 * **or**, ``P``\ *j* is |required|_ ``<X,F>``, and 445 446 - ``X`` is some ``K``\ *i*, **and** 447 - ``mpl::apply<F,R``\ *i*\ ``>::type::value`` is ``true`` 448 449.. _operator(): 450 451``operator()`` 452 .. parsed-literal:: 453 454 template <class A0> |ArgumentPack|_ operator()(A0 const& a0) const; 455 456 :vellipsis:`⋮` 457 458 template <class A0, …class A\ β> |ArgumentPack|_ `operator()`_\(A0 const& a0, …A\ β const& a\ β) const; 459 460 :Returns: 461 An |ArgumentPack|_ containing, for each ``a``\ *i*, 462 463 - if ``a``\ *i*, is a single-element |ArgumentPack|, its element 464 - Otherwise, a |tagged reference| with |kw|_ ``K``\ *i* and *value* ``a``\ *i* 465 466 467.. |optional| replace:: ``optional`` 468.. |required| replace:: ``required`` 469 470.. _optional: 471.. _required: 472 473``optional``, ``required`` 474-------------------------- 475 476These templates describe the requirements on a function parameter. 477 478:Defined in: `boost/parameter/parameters.hpp`__ 479 480__ ../../../../boost/parameter/parameters.hpp 481 482:Specializations model: |ParameterSpec|_ 483 484.. parsed-literal:: 485 486 template <class Tag, class Predicate = *unspecified*> 487 struct optional; 488 489 template <class Tag, class Predicate = *unspecified*> 490 struct required; 491 492The default value of ``Predicate`` is an unspecified |Metafunction|_ that returns 493``mpl::true_`` for any argument. 494 495.. |Metafunction| replace:: :concept:`Metafunction` 496.. _Metafunction: ../../../mpl/doc/refmanual/metafunction.html 497 498 499``deduced`` 500----------- 501 502This template is used to wrap the *keyword tag* argument to 503``optional`` or ``required``. 504 505:Defined in: `boost/parameter/parameters.hpp`__ 506 507__ ../../../../boost/parameter/parameters.hpp 508 509.. parsed-literal:: 510 511 template <class Tag> 512 struct deduced; 513 514 515////////////////////////////////////////////////////////////////////////////// 516 517Metafunctions 518============= 519 520A |Metafunction|_ is conceptually a function that operates on, and 521returns, C++ types. 522 523``binding`` 524----------- 525 526Returns the result type of indexing an argument pack with a 527|keyword tag type| or with a |tagged default|. 528 529:Defined n: `boost/parameter/binding.hpp`__ 530 531__ ../../../../boost/parameter/binding.hpp 532 533.. parsed-literal:: 534 535 template <class A, class K, class D = void> 536 struct binding 537 { 538 typedef … type; 539 }; 540 541:Requires: ``A`` is a model of |ArgumentPack|_. 542 543:Returns: the reference type of the |tagged reference| in ``A`` 544 having |keyword tag type| ``K``, if any. If no such |tagged 545 reference| exists, returns ``D``. 546 547``lazy_binding`` 548---------------- 549 550Returns the result type of indexing an argument pack with a |tagged 551lazy default|. 552 553:Defined in: 554 `boost/parameter/binding.hpp`__ 555 556__ ../../../../boost/parameter/binding.hpp 557 558.. parsed-literal:: 559 560 template <class A, class K, class F> 561 struct lazy_binding 562 { 563 typedef … type; 564 }; 565 566:Requires: ``A`` is a model of |ArgumentPack|_. 567 568:Returns: the reference type of the |tagged reference| in ``A`` 569 having |keyword tag type| ``K``, if any. If no such |tagged 570 reference| exists, returns ``boost::``\ |result_of|_\ ``<F()>::type``. [#no_result_of]_ 571 572 573``value_type`` 574-------------- 575 576Returns the result type of indexing an argument pack with a 577|keyword tag type| or with a |tagged default|. 578 579:Defined n: `boost/parameter/value_type.hpp`__ 580 581__ ../../../../boost/parameter/value_type.hpp 582 583.. parsed-literal:: 584 585 template <class A, class K, class D = void> 586 struct value_type 587 { 588 typedef … type; 589 }; 590 591:Requires: ``A`` is a model of |ArgumentPack|_. 592 593:Returns: the type of the |tagged reference| in ``A`` 594 having |keyword tag type| ``K``, if any. If no such |tagged 595 reference| exists, returns ``D``. Equivalent to:: 596 597 typename remove_reference< 598 typename binding<A, K, D>::type 599 >::type 600 601 … when ``D`` is not a reference type. 602 603 604////////////////////////////////////////////////////////////////////////////// 605 606Code Generation Macros 607====================== 608 609Macros in this section can be used to ease the writing of code 610using the Parameter libray by eliminating repetitive boilerplate. 611 612 613``BOOST_PARAMETER_FUNCTION(result,name,tag_namespace,arguments)`` 614----------------------------------------------------------------- 615 616:Defined in: `boost/parameter/preprocessor.hpp`__ 617 618__ ../../../../boost/parameter/preprocessor.hpp 619 620:Requires: ``result`` is the parenthesized return type of the function. 621 ``name`` is the base name of the function, this is the name of the 622 generated forwarding functions. ``tag_namespace`` is the namespace in 623 which the keywords used by the function resides. ``arguments`` is 624 a list of *argument specifiers*, as defined below. 625 626 627:Argument specifiers syntax: 628 .. parsed-literal:: 629 630 argument-specifiers ::= *specifier-group* {*specifier-group*} 631 632 specifier-group0 ::= *specifier-group1* | 633 ( '**(**' '**deduced**' *specifier-group1* {*specifier-group1*} '**)**' ) 634 635 specifier-group1 ::= ( '**(**' '**optional**' *optional-specifier* {*optional-specifier*} '**)**' ) | 636 ( '**(**' '**required**' *required-specifier* {*required-specifier*} '**)**' ) 637 638 optional-specifier ::= '**(**' *name* '**,**' *restriction* '**,**' *default-value* ')' 639 required-specifier ::= '**(**' *name* '**,**' *restriction* ')' 640 641 restriction ::= ('*****' '**(**' *lambda-expression* '**)**' ) | 642 ( '**(**' *typename* '**)**' ) | 643 '*****' 644 645 ``name`` is any valid C++ identifier. ``default-value`` is any valid 646 C++ expression. ``typename`` is the name of a type. 647 ``lambda-expression`` is an `MPL lambda expression`_. 648 649.. _`MPL lambda expression`: ../../../mpl/doc/refmanual/lambda-expression.html 650 651:Generated names in enclosing scope: 652 * ``boost_param_result_ ## __LINE__ ## name`` 653 * ``boost_param_params_ ## __LINE__ ## name`` 654 * ``boost_param_parameters_ ## __LINE__ ## name`` 655 * ``boost_param_impl ## name`` 656 * ``boost_param_default_ ## __LINE__ ## name`` 657 658 659Approximate expansion: 660 **Where**: 661 662 * ``n`` denotes the *minimum* arity, as determined from ``arguments``. 663 * ``m`` denotes the *maximum* arity, as determined from ``arguments``. 664 665 .. parsed-literal:: 666 667 template <class T> 668 struct boost_param_result\_ ## __LINE__ ## **name** 669 { 670 typedef **result** type; 671 }; 672 673 struct boost_param_params\_ ## __LINE__ ## **name** 674 : boost::parameter::parameters< 675 *list of parameter specifications, based on arguments* 676 > 677 {}; 678 679 typedef boost_param_params\_ ## __LINE__ ## **name** 680 boost_param_parameters\_ ## __LINE__ ## **name**; 681 682 template <class A0, …, class A\ **n**> 683 *result type* **name**\ ( 684 A0 *cv*\ & a0, …, A\ **n** *cv*\ & a\ **n** 685 , typename boost_param_parameters\_ ## __LINE__ ## **name**::match< 686 A0 *cv*, …, A\ **n** *cv* 687 >::type = boost_param_parameters\_ ## __LINE__ ## **name**\ () 688 ) 689 { 690 *… forward to implementation …* 691 } 692 693 :vellipsis:`⋮` 694 695 template <class A0, …, class A\ **m**> 696 *result type* **name**\ ( 697 A0 *cv*\ & a0, …, A\ **m** *cv*\ & a\ **m** 698 , typename boost_param_parameters\_ ## __LINE__ ## **name**::match< 699 A0 *cv*, …, A\ **m** *cv* 700 >::type = boost_param_parameters\_ ## __LINE__ ## **name**\ () 701 ) 702 { 703 *… forward to implementation …* 704 } 705 706 template < 707 class ResultType 708 , class *argument name*\ **0** ## _type 709 … 710 , class *argument name*\ **m** ## _type 711 > 712 ResultType boost_param_default\_ ## __LINE__ ## **name**\ ( 713 (ResultType(*)()) 714 , *argument name*\ **0** ## _type& *argument name*\ **0** 715 … 716 , *argument name*\ **m** ## _type& *argument name*\ **m** 717 ) 718 719 720 721``BOOST_PARAMETER_MEMBER_FUNCTION(result,name,tag_namespace,arguments)`` 722------------------------------------------------------------------------ 723 724:Defined in: `boost/parameter/preprocessor.hpp`__ 725 726__ ../../../../boost/parameter/preprocessor.hpp 727 728See ``BOOST_PARAMETER_FUNCTION(result,name,tag_namespace,arguments)`` 729 730 731 732``BOOST_PARAMETER_CONSTRUCTOR(cls, impl, tag_namespace, arguments)`` 733-------------------------------------------------------------------- 734 735:Defined in: `boost/parameter/preprocessor.hpp`__ 736 737__ ../../../../boost/parameter/preprocessor.hpp 738 739:Requires: ``cls`` is the name of this class. ``impl`` is the 740 parenthesized implementation base class for ``cls``. 741 ``tag_namespace`` is the namespace in which the keywords 742 used by the function resides. ``arguments`` is 743 a list of *argument specifiers*, as defined in 744 ``BOOST_PARAMETER_FUNCTION(result,name,tag_namespace,arguments)``. 745 746:Generated names in enclosing scope: 747 * ``boost_param_params_ ## __LINE__ ## ctor`` 748 * ``constructor_parameters ## __LINE__`` 749 750Approximate expansion: 751 **Where**: 752 753 * ``n`` denotes the *minimum* arity, as determined from ``arguments``. 754 * ``m`` denotes the *maximum* arity, as determined from ``arguments``. 755 756 .. parsed-literal:: 757 758 struct boost_param_params\_ ## __LINE__ ## ctor 759 : boost::parameter::parameters< 760 *list of parameter specifications, based on arguments* 761 > 762 {}; 763 764 typedef boost_param_params\_ ## __LINE__ ## **name** 765 constructor_parameters ## __LINE__; 766 767 template <class A0, …, class A\ **n**> 768 *cls*\ (A0 const& a0, …, A\ **n** const& a\ **n**) 769 : *impl*\ (constructor_parameters ## __LINE__(a0, …, a\ **n**)) 770 {} 771 772 :vellipsis:`⋮` 773 774 template <class A0, …, class A\ **m**> 775 *cls*\ (A0 const& a0, …, A\ **n** const& a\ **m**) 776 : *impl*\ (constructor_parameters ## __LINE__(a0, …, a\ **m**)) 777 {} 778 779 780``BOOST_PARAMETER_NAME(name)`` 781------------------------------ 782 783Declares a tag-type and keyword object. 784 785Expands to: 786 787**If** *name* is of the form: 788 789.. parsed-literal:: 790 791 (*tag-name*, *namespace-name*) *object-name* 792 793**then** 794 795.. parsed-literal:: 796 797 namespace *namespace-name* 798 { 799 struct *tag-name* 800 { 801 static char const* keyword_name() 802 { 803 return ##\ *tag-name*; 804 } 805 806 typedef *unspecified* _; 807 typedef *unspecified* _1; 808 }; 809 } 810 811 ::boost::parameter::keyword<*tag-namespace*\ ::\ *tag-name*\ > const& *object-name* 812 = ::boost::parameter::keyword<*tag-namespace*\ ::\ *tag-name*\ >::instance; 813 814**Else** 815 816.. parsed-literal:: 817 818 namespace tag 819 { 820 struct *name* 821 { 822 static char const* keyword_name() 823 { 824 return ##\ *name*; 825 } 826 827 typedef *unspecified* _; 828 typedef *unspecified* _1; 829 }; 830 } 831 832 ::boost::parameter::keyword<tag::\ *name*\ > const& _\ *name* 833 = ::boost::parameter::keyword<tag::\ *name*\ >::instance; 834 835 836``BOOST_PARAMETER_TEMPLATE_KEYWORD(name)`` 837------------------------------------------ 838 839Expands to: 840 841.. parsed-literal:: 842 843 namespace tag 844 { 845 struct *name*; 846 } 847 848 template <class T> 849 struct *name* 850 : ::boost::parameter::template_keyword<tag::\ *name*, T> 851 {}; 852 853 854``BOOST_PARAMETER_FUN(r,n,l,h,p)`` 855---------------------------------- 856 857.. admonition:: Deprecated 858 859 This macro has been deprecated in favor of 860 ``BOOST_PARAMETER_FUNCTION``. 861 862Generates a sequence of `forwarding function`_ templates named 863``n``, with arities ranging from ``l`` to ``h`` , returning ``r``, 864and using ``p`` to control overload resolution and assign tags to 865positional arguments. 866 867:Defined in: `boost/parameter/macros.hpp`__ 868 869__ ../../../../boost/parameter/macros.hpp 870 871:Requires: ``l`` and ``h`` are nonnegative integer tokens such 872 that ``l`` < ``h`` 873 874Generates 875 .. parsed-literal:: 876 877 template <class A1, class A2, …class A##\ **l**> 878 r name( 879 A1 const& a1, A2 const& a2, …A\ **l** const& x\ **l** 880 , typename **p**::match<A1,A2,…A\ **l**>::type p = **p**\ ()) 881 { 882 return **name**\ _with_named_params(**p**\ (x1,x2,…x\ **l**)); 883 } 884 885 template <class A1, class A2, …class A\ **l**, class A\ ##\ BOOST_PP_INC_\ (**l**)> 886 r name( 887 A1 const& a1, A2 const& a2, …A\ **l** const& x\ **l** 888 , A\ ##\ BOOST_PP_INC_\ (**l**) const& x\ ##\ BOOST_PP_INC_\ (**l**) 889 , typename **p**::match<A1,A2,…A\ **l**,A\ ##\ BOOST_PP_INC_\ (**l**)>::type p = **p**\ ()) 890 { 891 return **name**\ _with_named_params(**p**\ (x1,x2,…x\ **l**,x\ ##\ BOOST_PP_INC_\ (**l**))); 892 } 893 894 :vellipsis:`⋮` 895 896 template <class A1, class A2, …class A\ **h**> 897 r name( 898 A1 const& a1, A2 const& a2, …A\ **h** const& x\ **h** 899 , typename **p**::match<A1,A2,…A\ **h**>::type p = **p**\ ()) 900 { 901 return **name**\ _with_named_params(**p**\ (a1,a2,…a\ **h**)); 902 } 903 904 905.. _BOOST_PP_INC: ../../../preprocessor/doc/ref/inc.html 906 907``BOOST_PARAMETER_KEYWORD(n,k)`` 908-------------------------------- 909 910.. admonition:: Deprecated 911 912 This macro has been deprecated in favor of 913 ``BOOST_PARAMETER_NAME``. 914 915Generates the declaration of a |keyword tag type| named ``k`` in 916namespace ``n``, and a corresponding |keyword object| definition in 917the enclosing namespace. 918 919:Defined in: `boost/parameter/keyword.hpp`__ 920 921__ ../../../../boost/parameter/keyword.hpp 922 923Generates 924 .. parsed-literal:: 925 926 namespace **n** { struct **k**; } 927 namespace { 928 boost::parameter::keyword<*tag-namespace*::**k**>& **k** 929 = boost::parameter::keyword<*tag-namespace*::**k**>::get(); 930 } 931 932``BOOST_PARAMETER_MATCH(p,a,x)`` 933-------------------------------- 934 935Generates a defaulted parameter declaration for a `forwarding 936function`_. 937 938:Defined in: `boost/parameter/match.hpp`__ 939 940__ ../../../../boost/parameter/match.hpp 941 942:Requires: ``a`` is a `Boost.Preprocessor sequence`__ 943 of the form 944 945 .. parsed-literal:: 946 947 (A0)(A1)…(A\ *n*) 948 949__ http://www.boost.org/libs/preprocessor/doc/data.html 950 951Generates 952 .. parsed-literal:: 953 954 typename **p**::match<**A0**\ ,\ **A1**\ …,\ **A**\ *n*>::type **x** = **p**\ () 955 956 957Configuration Macros 958==================== 959 960``BOOST_PARAMETER_MAX_ARITY`` 961----------------------------- 962 963Determines the maximum number of arguments supported by the 964library. Will only be ``#defined`` by the library if it is not 965already ``#defined``. 966 967.. |BOOST_PARAMETER_MAX_ARITY| replace:: ``BOOST_PARAMETER_MAX_ARITY`` 968 969:Defined in: `boost/parameter/config.hpp`__ 970 971__ ../../../../boost/parameter/config.hpp 972 973:Default Value: ``8`` 974 975Tutorial 976======== 977 978Follow `this link`__ to the Boost.Parameter tutorial 979documentation. 980 981__ index.html#tutorial 982 983////////////////////////////////////////////////////////////// 984 985.. [#thread] References to tag objects may be initialized multiple 986 times. This scenario can only occur in the presence of 987 threading. Because the C++ standard doesn't consider threading, 988 it doesn't explicitly allow or forbid multiple initialization of 989 references. That said, it's hard to imagine an implementation 990 where it could make a difference. 991 992.. [#no_result_of] Where |BOOST_NO_RESULT_OF|_ is ``#defined``, 993 ``boost::``\ |result_of|_\ ``<F()>::type`` is replaced by 994 ``F::result_type``. 995 996.. |result_of| replace:: ``result_of`` 997.. _result_of: ../../../utility/utility.htm#result_of 998 999.. |BOOST_NO_RESULT_OF| replace:: ``BOOST_NO_RESULT_OF`` 1000.. _BOOST_NO_RESULT_OF: ../../../utility/utility.htm#BOOST_NO_RESULT_OF 1001 1002