<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="https://www.baszerr.eu/lib/exe/css.php?s=feed" type="text/css"?>
<rss version="2.0">
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>BaSzErr - blog:2012:12:28</title>
        <description></description>
        <link>https://www.baszerr.eu/</link>
        <lastBuildDate>Wed, 06 May 2026 09:36:05 +0000</lastBuildDate>
        <generator>FeedCreator 1.8</generator>
        <image>
            <url>https://www.baszerr.eu/lib/exe/fetch.php?media=wiki:dokuwiki.svg</url>
            <title>BaSzErr</title>
            <link>https://www.baszerr.eu/</link>
        </image>
        <item>
            <title>1</title>
            <link>https://www.baszerr.eu/doku.php?id=blog:2012:12:28:1</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;named_parameter&quot;&gt;2012.12.28 - named parameter&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
many languages have support for named parameter. that is you can type something like:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;size(width=42, height=13)&lt;/pre&gt;

&lt;p&gt;
instead of unintuitive (when reading code) &lt;em&gt;size(42,13)&lt;/em&gt;… wait – or was it &lt;em&gt;size(13,42)&lt;/em&gt;? you get the point. there is one more nice use case – providing non-default value for a single parameter, out of many with default values. that is:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;connect(user, pass, host=&amp;quot;localhost&amp;quot;, ssl=false, keepAlive=false);&lt;/pre&gt;

&lt;p&gt;
now try connecting with this function, changing only SSL to be set to true.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;2012.12.28 - named parameter&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;named_parameter&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-550&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;boost_named_parameters&quot;&gt;boost named parameters&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
C++ lacks support for named parameters, though (as usual) it can be overcome. &lt;a href=&quot;http://www.boost.org/doc/libs/1_37_0/libs/parameter/doc/html/&quot; class=&quot;urlextern&quot; title=&quot;http://www.boost.org/doc/libs/1_37_0/libs/parameter/doc/html/&quot; rel=&quot;ugc nofollow&quot;&gt;boost named parameters&lt;/a&gt; library does that using macros and setters. example syntax is:
&lt;/p&gt;
&lt;pre class=&quot;code c&quot;&gt;  &lt;span class=&quot;co1&quot;&gt;// some declarations goes here...&lt;/span&gt;
  func&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; _my2&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;MyClass&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
the problem is that arguments are always copied. this is not nice, when you&amp;#039;re passing bigger elements, like user-defined classes, that may have non-inline, non-trivial copy c-tor.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;boost named parameters&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;boost_named_parameters&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;551-1082&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;variadic_templates_solution&quot;&gt;variadic templates solution&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
recently i&amp;#039;ve came to the conclusion that the same can be done suing variadic templates and perfect forwarding.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;variadic templates solution&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;variadic_templates_solution&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1083-1237&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit4&quot; id=&quot;general_idea&quot;&gt;general idea&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
the basic idea is to get all c-tor arguments as a variadic template arguments and then use extractor, that will return proper argument from all arguments provided. argument extraction is then calling extractor with different argument, to extract different values. example code may look like this:
&lt;/p&gt;
&lt;pre class=&quot;code c&quot;&gt;template&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;typename E&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;kw4&quot;&gt;struct&lt;/span&gt; extract
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
  template&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;typename T&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;
  explicit extract&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;T t&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; default_&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;t&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  E from&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; default_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  template&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;typename ...&lt;span class=&quot;me1&quot;&gt;Tail&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;
  E from&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;E e&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; Tail...&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; e&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  template&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;typename Head&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; typename ...&lt;span class=&quot;me1&quot;&gt;Tail&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;
  E from&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Head&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; Tail...&lt;span class=&quot;me1&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; from&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;t...&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
private&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt;
  E default_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;co1&quot;&gt;// ...&lt;/span&gt;
class Conn
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
public&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;kw4&quot;&gt;struct&lt;/span&gt; Host &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;string&lt;/span&gt; value_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kw4&quot;&gt;struct&lt;/span&gt; User &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;string&lt;/span&gt; value_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kw4&quot;&gt;struct&lt;/span&gt; Pass &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;string&lt;/span&gt; value_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kw4&quot;&gt;struct&lt;/span&gt; UseSSL &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt; bool value_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kw4&quot;&gt;struct&lt;/span&gt; RetryCount &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;unsigned&lt;/span&gt; value_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  template&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;typename ...&lt;span class=&quot;me1&quot;&gt;Args&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;
  explicit Conn&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Args...&lt;span class=&quot;me1&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt;
    host_&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; extract&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;Host&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;my.db.org&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;a...&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;value_&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    user_&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; extract&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;User&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;john&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;a...&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;value_&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    pass_&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; extract&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;Pass&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;doe1940&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;a...&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;value_&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    useSSL_&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; extract&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;UseSSL&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw2&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;a...&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;value_&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    retCnt_&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; extract&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;RetryCount&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;10u&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;a...&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;value_&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    my_&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; extract&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;MyClass&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;MyClass&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;a...&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span class=&quot;co1&quot;&gt;// ...&lt;/span&gt;
&amp;nbsp;
private&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt;
  decltype&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Host&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;value_&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;       host_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  decltype&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;User&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;value_&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;       user_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  decltype&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Pass&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;value_&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;       pass_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  decltype&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;UseSSL&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;value_&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;     useSSL_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  decltype&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;RetryCount&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;value_&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; retCnt_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  MyClass                      my_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
above example works fine, but:
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; it does a lot of unneeded copies.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; it always created default value, that sometimes is overwritten.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; it does not check for errors (missing argument, argument given more than once).&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;general idea&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;general_idea&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1238-2998&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit5&quot; id=&quot;down_the_rabbit_hole&quot;&gt;down the rabbit hole&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
to get rid of extra copies perfect forwarding can be used. default argument need not be created, unless it is needed (i.e. no explicit, user-provided value is given) – lambda function can be used to create one for us! finally error checking can be done, by ensuring that each argument (when extracted), exists only in one instance. for checking for lack of argument, when no default value is provided, special type can be used.
&lt;/p&gt;

&lt;/div&gt;

&lt;h4 id=&quot;improved_extractor&quot;&gt;improved extractor&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
our new extract can look like this:
&lt;/p&gt;
&lt;pre class=&quot;code c&quot;&gt;&lt;span class=&quot;coMULTI&quot;&gt;/** @brief type signalling that there is no default value present for a given parameter. */&lt;/span&gt;
&lt;span class=&quot;kw4&quot;&gt;struct&lt;/span&gt; NoDefaultValue &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
&lt;span class=&quot;coMULTI&quot;&gt;/** @brief extractor template - gets the value of a given paramter. */&lt;/span&gt;
template&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;typename E&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;kw4&quot;&gt;struct&lt;/span&gt; extract
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
  &lt;span class=&quot;coMULTI&quot;&gt;/** @brief extracts type E from the Args argument list, default value or compilation error. */&lt;/span&gt;
  template&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;typename...&lt;span class=&quot;me1&quot;&gt;Args&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt; E from&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Args&lt;span class=&quot;sy0&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;...&lt;span class=&quot;me1&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    ensureUnique&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;forward&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;Args&lt;span class=&quot;sy0&quot;&gt;&amp;amp;&amp;amp;&amp;gt;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;args&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;... &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;      &lt;span class=&quot;co1&quot;&gt;// sanity check&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; fromImpl&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;forward&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;Args&lt;span class=&quot;sy0&quot;&gt;&amp;amp;&amp;amp;&amp;gt;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;args&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;... &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;   &lt;span class=&quot;co1&quot;&gt;// actuall implementation&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
private&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;coMULTI&quot;&gt;/** @brief short for remove_cv and decay on a given type. */&lt;/span&gt;
  template&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;typename T&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;kw4&quot;&gt;struct&lt;/span&gt; Raw
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;kw4&quot;&gt;typedef&lt;/span&gt; typename remove_cv&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;typename decay&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;T&lt;span class=&quot;sy0&quot;&gt;&amp;gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;type&lt;/span&gt; type&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  &lt;span class=&quot;co1&quot;&gt;//&lt;/span&gt;
  &lt;span class=&quot;co1&quot;&gt;// counts number of occurences of given type C in the argument list.&lt;/span&gt;
  &lt;span class=&quot;co1&quot;&gt;//&lt;/span&gt;
  template&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;typename C&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; typename Head&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; typename...&lt;span class=&quot;me1&quot;&gt;Tail&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt; constexpr &lt;span class=&quot;kw4&quot;&gt;size_t&lt;/span&gt; count&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;is_same&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt; typename Raw&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;C&lt;span class=&quot;sy0&quot;&gt;&amp;gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
                     typename Raw&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;Head&lt;span class=&quot;sy0&quot;&gt;&amp;gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt;
            count&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;C&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;Tail...&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  template&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;typename C&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt; constexpr &lt;span class=&quot;kw4&quot;&gt;size_t&lt;/span&gt; count&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  &lt;span class=&quot;co1&quot;&gt;//&lt;/span&gt;
  &lt;span class=&quot;co1&quot;&gt;// extraction itself&lt;/span&gt;
  &lt;span class=&quot;co1&quot;&gt;//&lt;/span&gt;
  &lt;span class=&quot;coMULTI&quot;&gt;/** @brief template used for signalling missing parameter of a given type. */&lt;/span&gt;
  template&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;typename T&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;
  constexpr bool missingParameter&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span class=&quot;coMULTI&quot;&gt;/** @brief causes compilation error when required parameter is not supplied. */&lt;/span&gt;
  &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt; E fromImpl&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;NoDefaultValue&lt;span class=&quot;sy0&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    static_assert&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; missingParameter&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;E&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;missing paramter with no default value: &amp;quot;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span class=&quot;coMULTI&quot;&gt;/** @brief created default agrument, using user-provided functor. */&lt;/span&gt;
  template&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;typename F&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt; E fromImpl&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;F&lt;span class=&quot;sy0&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; f&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; f&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span class=&quot;coMULTI&quot;&gt;/** @brief extractor of a given paramter, when it has been found. */&lt;/span&gt;
  template&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;typename Head&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; typename ...&lt;span class=&quot;me1&quot;&gt;Tail&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt;
  typename enable_if&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt; is_same&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt; typename Raw&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;Head&lt;span class=&quot;sy0&quot;&gt;&amp;gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; E &lt;span class=&quot;sy0&quot;&gt;&amp;gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; E &lt;span class=&quot;sy0&quot;&gt;&amp;gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;type&lt;/span&gt;
  fromImpl&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Head&lt;span class=&quot;sy0&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; e&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; Tail&lt;span class=&quot;sy0&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;...&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;forward&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;Head&lt;span class=&quot;sy0&quot;&gt;&amp;amp;&amp;amp;&amp;gt;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;e&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span class=&quot;coMULTI&quot;&gt;/** @brief general search - no proper value found yet. */&lt;/span&gt;
  template&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;typename Head&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; typename ...&lt;span class=&quot;me1&quot;&gt;Tail&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt;
  typename enable_if&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;!&lt;/span&gt;is_same&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt; typename Raw&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;Head&lt;span class=&quot;sy0&quot;&gt;&amp;gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; E &lt;span class=&quot;sy0&quot;&gt;&amp;gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; E &lt;span class=&quot;sy0&quot;&gt;&amp;gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;type&lt;/span&gt;
  fromImpl&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Head&lt;span class=&quot;sy0&quot;&gt;&amp;amp;&amp;amp;,&lt;/span&gt; Tail&lt;span class=&quot;sy0&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;...&lt;span class=&quot;me1&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; fromImpl&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;forward&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;Tail&lt;span class=&quot;sy0&quot;&gt;&amp;amp;&amp;amp;&amp;gt;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;t&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;...&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  &lt;span class=&quot;co1&quot;&gt;//&lt;/span&gt;
  &lt;span class=&quot;co1&quot;&gt;// wrapper call that ensures all arguments are unique.&lt;/span&gt;
  &lt;span class=&quot;co1&quot;&gt;//&lt;/span&gt;
  template&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;typename Head&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; typename...&lt;span class=&quot;me1&quot;&gt;Tail&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; ensureUnique&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Head&lt;span class=&quot;sy0&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; head&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; Tail&lt;span class=&quot;sy0&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;...&lt;span class=&quot;me1&quot;&gt;tail&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    static_assert&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; count&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;Head&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;Tail...&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;argument is repeated&amp;quot;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;    &lt;span class=&quot;co1&quot;&gt;// check current one&lt;/span&gt;
    ensureUnique&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;forward&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt;Tail&lt;span class=&quot;sy0&quot;&gt;&amp;amp;&amp;amp;&amp;gt;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;tail&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;... &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;                          &lt;span class=&quot;co1&quot;&gt;// check next&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kw4&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; ensureUnique&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
class NoDefaultValue is passed as the last argument to the extractor, to signal end of arguments, while no default value is provided. it is provided explicitly, since otherwise last argument is expected to be lambda, that creates default value, if it is available.
&lt;/p&gt;

&lt;p&gt;
private section contains &lt;em&gt;Raw&lt;/em&gt; class, that is a simple wrapper to get raw type (no CV, references, etc…) – they make type matching difficult, this are not welcomed when checking types, though cannot be simply removed, since lvalue/rvalue difference is crucial for perfect forwarding functionality. this is why &lt;em&gt;enable_if&lt;/em&gt; does appear in code few times, to make sure compiler uses call that we want it to use.
&lt;/p&gt;

&lt;p&gt;
&lt;em&gt;count&lt;/em&gt; methods are used to count number of instances of a given type in the argument list. it is then used in the &lt;em&gt;ensureUnique&lt;/em&gt; method to do sanity checks for all arguments.
&lt;/p&gt;

&lt;p&gt;
whole implementation consists of &lt;em&gt;fromImpl&lt;/em&gt; methods. the interesting part is usage of &lt;em&gt;missingParameter&lt;/em&gt; template, that makes static assertion failed, when no explicit value is given, while default is not provided. this stops compilation, but &lt;em&gt;missingPameter&lt;/em&gt; must be a template, so that it will not be instanciated, unless error-signaling &lt;em&gt;fromImpl&lt;/em&gt; is requested.
&lt;/p&gt;

&lt;/div&gt;

&lt;h4 id=&quot;wrapper_macros&quot;&gt;wrapper macros&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
to make it all look a bit simpler on the user-end wrapper macros are provided:
&lt;/p&gt;
&lt;pre class=&quot;code c&quot;&gt;&lt;span class=&quot;coMULTI&quot;&gt;/** @brief declares c-tor of the class with the named parameters. */&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define BNP_CONSTRUCTOR(name) template&amp;lt;typename ...Args&amp;gt; explicit name(Args&amp;amp;&amp;amp;...a)&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;coMULTI&quot;&gt;/** @brief declares new paramter type. */&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define BNP_MK_PARAM(name, type) struct name { type value_; operator type&amp;amp;&amp;amp;(void) { return std::move(value_); } }&lt;/span&gt;
&lt;span class=&quot;coMULTI&quot;&gt;/** @brief gets the underlying type from the parameter wrapper. */&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define BNP_PARAM_TYPE(type) decltype(type::value_)&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;coMULTI&quot;&gt;/** @brief extracts given paramter via the type. */&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define BNP_EXTRACT(type)           extract&amp;lt;type&amp;gt;::from( std::forward&amp;lt;Args&amp;amp;&amp;amp;&amp;gt;(a)..., NoDefaultValue{}           )&lt;/span&gt;
&lt;span class=&quot;coMULTI&quot;&gt;/** @brief the same as BNP_EXTRACT but with the explicitly provided default value. */&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define BNP_EXTRACT_D(type, defVal) extract&amp;lt;type&amp;gt;::from( std::forward&amp;lt;Args&amp;amp;&amp;amp;&amp;gt;(a)..., [](){return type{defVal};} )&lt;/span&gt;
&lt;span class=&quot;coMULTI&quot;&gt;/** @brief the same as BNP_EXTRACT but informing that the default c-tor is to be used for default value. */&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#define BNP_EXTRACT_DC(type)        extract&amp;lt;type&amp;gt;::from( std::forward&amp;lt;Args&amp;amp;&amp;amp;&amp;gt;(a)..., [](){return type{};}       )&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4 id=&quot;example_class_declaration&quot;&gt;example class declaration&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
having this done, usage is really simple:
&lt;/p&gt;
&lt;pre class=&quot;code c&quot;&gt;class Conn
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
public&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt;
  BNP_MK_PARAM&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Host&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  BNP_MK_PARAM&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;User&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  BNP_MK_PARAM&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Pass&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  BNP_MK_PARAM&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;UseSSL&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; bool&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  BNP_MK_PARAM&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;RetryCount&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;unsigned&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;co1&quot;&gt;// NOTE: no declaration for user&#039;s unique type&lt;/span&gt;
&amp;nbsp;
  BNP_CONSTRUCTOR&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Conn&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt;
    host_&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; BNP_EXTRACT_D&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Host&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;my.db.org&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    user_&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; BNP_EXTRACT_D&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;User&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;john&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    pass_&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; BNP_EXTRACT_D&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Pass&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;doe1940&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    useSSL_&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; BNP_EXTRACT_D&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;UseSSL&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    retCnt_&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; BNP_EXTRACT_D&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;RetryCount&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; 10u&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    my_&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; BNP_EXTRACT_DC&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;MyClass&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span class=&quot;co1&quot;&gt;// ...&lt;/span&gt;
private&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt;
  BNP_PARAM_TYPE&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Host&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;       host_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  BNP_PARAM_TYPE&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;User&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;       user_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  BNP_PARAM_TYPE&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Pass&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;       pass_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  BNP_PARAM_TYPE&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;UseSSL&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;     useSSL_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  BNP_PARAM_TYPE&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;RetryCount&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; retCnt_&lt;span class=&quot;sy0&quot;&gt;;;&lt;/span&gt;
  MyClass                    my_&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4 id=&quot;usage&quot;&gt;usage&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
now usage is trivial – all one have to do is to create arguments by type, and pass them to the function:
&lt;/p&gt;
&lt;pre class=&quot;code c&quot;&gt;    Conn c1&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;co1&quot;&gt;// ok - all default&lt;/span&gt;
    Conn c2&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; Conn&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;UseSSL&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; Conn&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;alice&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; Conn&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;Pass&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;$3cr37&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;co1&quot;&gt;// overwrite some&lt;/span&gt;
    Conn c3&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; Conn&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;Host&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;other.db.host.org&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;co1&quot;&gt;// ...&lt;/span&gt;
    Conn c&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; Conn&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;Host&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;other.db.host.org&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; MyClass&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;co1&quot;&gt;// provide user&#039;s arg&lt;/span&gt;
    MyClass mc1&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
    Conn c&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; Conn&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;UseSSL&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; mc1&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; Conn&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;alice&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; Conn&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;Pass&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;$3cr37&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;co1&quot;&gt;// copy user&#039;s arg&lt;/span&gt;
    &lt;span class=&quot;kw4&quot;&gt;const&lt;/span&gt; MyClass mc2&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
    Conn c&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; Conn&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;UseSSL&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; mc2&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; Conn&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;alice&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; Conn&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;Pass&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;$3cr37&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;co1&quot;&gt;// copy const user&#039;s arg&lt;/span&gt;
    &lt;span class=&quot;kw4&quot;&gt;const&lt;/span&gt; Conn&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;UseSSL&lt;/span&gt; ssl&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
    Conn c&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt; ssl&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; Conn&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;UseSSL&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; Conn&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;alice&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; Conn&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;Pass&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;$3cr37&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;co1&quot;&gt;// ERROR: ssl is duplicated&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;down the rabbit hole&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;down_the_rabbit_hole&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;2999-10270&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit6&quot; id=&quot;code&quot;&gt;code&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
full code with the examples can be downloaded here: &lt;a href=&quot;https://www.baszerr.eu/lib/exe/fetch.php?media=blog:2012:12:28:param_passing-rvalue-macros.cpp&quot; class=&quot;media mediafile mf_cpp&quot; title=&quot;blog:2012:12:28:param_passing-rvalue-macros.cpp (6.6 KB)&quot;&gt;parameter passing with rvalue references source&lt;/a&gt;. all the examples (including test code and proof-of-concept code can be obtained from here: &lt;a href=&quot;https://www.baszerr.eu/lib/exe/fetch.php?media=blog:2012:12:28:param_passing.tar.bz2&quot; class=&quot;media mediafile mf_bz2&quot; title=&quot;blog:2012:12:28:param_passing.tar.bz2 (4 KB)&quot;&gt;full sources and PoCs&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
enjoy! :)
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;code&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;code&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:6,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;10271-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Tue, 15 Jun 2021 20:09:16 +0000</pubDate>
        </item>
    </channel>
</rss>
