220 24296 <20160210161034.4898896.57740.4502@gmail.com> article
Path: news.gmane.org!not-for-mail
From: Tony V E <tvaneerd@gmail.com>
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: Choosing value categories using a specialized
 traits class
Date: Wed, 10 Feb 2016 11:10:34 -0500
Lines: 703
Approved: news@gmane.org
Message-ID: <20160210161034.4898896.57740.4502@gmail.com>
References: <fe08947f-f85a-4f37-970f-0f057b5b9697@isocpp.org>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: plane.gmane.org
Mime-Version: 1.0
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
X-Trace: ger.gmane.org 1455120649 3476 80.91.229.3 (10 Feb 2016 16:10:49 GMT)
X-Complaints-To: usenet@ger.gmane.org
NNTP-Posting-Date: Wed, 10 Feb 2016 16:10:49 +0000 (UTC)
To: =?utf-8?b?QW5kcsOp?= <std-proposals@isocpp.org>, ISO C++ Standard - Future Proposals <std-proposals@isocpp.org>
Original-X-From: std-proposals+bncBCUZ5QWKNQIP3QPNWUCRUBDRU3VGA@isocpp.org Wed Feb 10 17:10:41 2016
Return-path: <std-proposals+bncBCUZ5QWKNQIP3QPNWUCRUBDRU3VGA@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-wm0-f72.google.com ([74.125.82.72])
	by plane.gmane.org with esmtp (Exim 4.69)
	(envelope-from <std-proposals+bncBCUZ5QWKNQIP3QPNWUCRUBDRU3VGA@isocpp.org>)
	id 1aTXLk-0004F0-B8
	for gclcip-std-proposals@m.gmane.org; Wed, 10 Feb 2016 17:10:40 +0100
Original-Received: by mail-wm0-f72.google.com with SMTP id 128sf11043969wmz.0
        for <gclcip-std-proposals@m.gmane.org>; Wed, 10 Feb 2016 08:10:39 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=isocpp-org.20150623.gappssmtp.com; s=20150623;
        h=content-type:mime-version:content-transfer-encoding:message-id:date
         :subject:from:in-reply-to:references:to:x-original-sender
         :x-original-authentication-results:reply-to:precedence:mailing-list
         :list-id:x-spam-checked-in-group:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe;
        bh=4HLh4TR3u+z92Xcp9u59n9mqnZFuCiJHjeEeMUudmZY=;
        b=1xaJE3bBuEylxZu0TsJ8uRwpalEAYZCuYxK7cMSz03zysn44uLFtVHeqwkNRzJil2H
         JHhpxgVCfFpMQ1dtJ/LvbAU5DeMfckYHg2kuvi/HFsn7YWcFS52TEPvlEwx7zW9qbmcv
         xMGocgEwGdLT660mw2j/7eFYqwE+Y0sduVY9+1SKEMClJUBHg9XiOs+s/dvUpIi9Yy52
         HWYUcmshLBdvoxGnspbiWvas0L3/5wJIifsPSKzfMZ6tNyBpc59YXO+OeiFDV7OIoABH
         tWAsE0BVxuVhcfva7mZOGQ6SxosN9L7m14ctYavFMbU1kKjDqgKfOE76RpYQ7sWM7i9E
    
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20130820;
        h=x-gm-message-state:content-type:mime-version
         :content-transfer-encoding:message-id:date:subject:from:in-reply-to
         :references:to:x-original-sender:x-original-authentication-results
         :reply-to:precedence:mailing-list:list-id:x-spam-checked-in-group
         :list-post:list-help:list-archive:list-subscribe:list-unsubscribe;
        bh=4HLh4TR3u+z92Xcp9u59n9mqnZFuCiJHjeEeMUudmZY=;
        b=cR0mItiA5p6KCB5/ifxdjViXycW5bUmDFgD/YcidsuBgj2EfWY+x8q4C581za9cVWm
         IChF8Dz1PqhknnRZhNj/i+61VQeyukwCzYTfKvsBFPKsjdI6IZUZ3tt0Kdw89etiLLql
         u4acBiSp7l234kmXJvhL+mmS1leFf1GNV2BgN1+MOwJe3tANPSvVaEIHBAnfhqNnCoL/
         IuTUVWmaCQ3PY4UEbqfAYOuOPcWM417UP5cJhlWdYy50TLDVWkcnT6duxqgBekHBXmWc
         Bl2I8fkYeXPMmDPSyxyCwGnQt+vTJu4WXJsL/3CjaKbmU/37YEArMP9PCp1P5h4UyCep 
X-Gm-Message-State: AG10YOQLKvGcixJmuwzHIznl6a8z1rP/tSPo8h521FPIjIdRfUngli/QBokSdAJew3Y47g==
X-Received: by 10.112.77.169 with SMTP id t9mr4861134lbw.8.1455120639706;
        Wed, 10 Feb 2016 08:10:39 -0800 (PST)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 10.140.23.229 with SMTP id 92ls409780qgp.65.gmail; Wed, 10 Feb
 2016 08:10:37 -0800 (PST)
X-Received: by 10.55.26.136 with SMTP id l8mr38493060qkh.103.1455120637644;
        Wed, 10 Feb 2016 08:10:37 -0800 (PST)
Original-Received: from mail-qg0-x232.google.com (mail-qg0-x232.google.com. [2607:f8b0:400d:c04::232])
        by mx.google.com with ESMTPS id 188si4297840qhj.38.2016.02.10.08.10.37
        for <std-proposals@isocpp.org>
        (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
        Wed, 10 Feb 2016 08:10:37 -0800 (PST)
Received-SPF: pass (google.com: domain of tvaneerd@gmail.com designates 2607:f8b0:400d:c04::232 as permitted sender) client-ip=2607:f8b0:400d:c04::232;
Original-Received: by mail-qg0-x232.google.com with SMTP id b35so16965551qge.0
        for <std-proposals@isocpp.org>; Wed, 10 Feb 2016 08:10:37 -0800 (PST)
X-Received: by 10.140.157.7 with SMTP id d7mr28846669qhd.17.1455120637433;
        Wed, 10 Feb 2016 08:10:37 -0800 (PST)
Original-Received: from [127.0.0.1] ([24.114.71.79])
        by smtp.gmail.com with ESMTPSA id f5sm1548313qkb.30.2016.02.10.08.10.34
        for <std-proposals@isocpp.org>
        (version=TLSv1/SSLv3 cipher=OTHER);
        Wed, 10 Feb 2016 08:10:35 -0800 (PST)
X-Mailer: BlackBerry Email (10.3.2.2876)
In-Reply-To: <fe08947f-f85a-4f37-970f-0f057b5b9697@isocpp.org>
X-Original-Sender: tvaneerd@gmail.com
X-Original-Authentication-Results: mx.google.com;       spf=pass (google.com:
 domain of tvaneerd@gmail.com designates 2607:f8b0:400d:c04::232 as permitted
 sender) smtp.mailfrom=tvaneerd@gmail.com;       dkim=pass header.i=@gmail.com;
       dmarc=pass (p=NONE dis=NONE) header.from=gmail.com
Precedence: list
Mailing-list: list std-proposals@isocpp.org; contact std-proposals+owners@isocpp.org
List-ID: <std-proposals.isocpp.org>
X-Spam-Checked-In-Group: std-proposals@isocpp.org
X-Google-Group-Id: 399137483710
List-Post: <https://groups.google.com/a/isocpp.org/group/std-proposals/post>, <mailto:std-proposals@isocpp.org>
List-Help: <https://support.google.com/a/isocpp.org/bin/topic.py?topic=25838>, <mailto:std-proposals+help@isocpp.org>
List-Archive: <https://groups.google.com/a/isocpp.org/group/std-proposals/>
List-Subscribe: <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>,
 <mailto:std-proposals+subscribe@isocpp.org>
List-Unsubscribe: <mailto:googlegroups-manage+399137483710+unsubscribe@googlegroups.com>,
 <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>
Xref: news.gmane.org gmane.comp.lang.c++.isocpp.proposals:24296
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/24296>

<html><head></head><body lang=3D"en-US" style=3D"background-color: rgb(255,=
 255, 255); line-height: initial;">                                        =
                                              <div style=3D"width: 100%; fo=
nt-size: initial; font-family: Calibri, 'Slate Pro', sans-serif, sans-serif=
; color: rgb(31, 73, 125); text-align: initial; background-color: rgb(255, =
255, 255);">Not a bad idea.&nbsp;</div><div style=3D"width: 100%; font-size=
: initial; font-family: Calibri, 'Slate Pro', sans-serif, sans-serif; color=
: rgb(31, 73, 125); text-align: initial; background-color: rgb(255, 255, 25=
5);"><br></div><div style=3D"width: 100%; font-size: initial; font-family: =
Calibri, 'Slate Pro', sans-serif, sans-serif; color: rgb(31, 73, 125); text=
-align: initial; background-color: rgb(255, 255, 255);">But I'd rather see =
some kind of language feature for param passing. A "pass by copy if cheap"=
=E2=80=8E syntax. Also a pass by copy-if-write (for cases where the functio=
n body I available to determine that).&nbsp;</div><div style=3D"width: 100%=
; font-size: initial; font-family: Calibri, 'Slate Pro', sans-serif, sans-s=
erif; color: rgb(31, 73, 125); text-align: initial; background-color: rgb(2=
55, 255, 255);"><br></div><div style=3D"width: 100%; font-size: initial; fo=
nt-family: Calibri, 'Slate Pro', sans-serif, sans-serif; color: rgb(31, 73,=
 125); text-align: initial; background-color: rgb(255, 255, 255);">Vaguely =
speaking. </div>                                                           =
                                                                          <=
div style=3D"width: 100%; font-size: initial; font-family: Calibri, 'Slate =
Pro', sans-serif, sans-serif; color: rgb(31, 73, 125); text-align: initial;=
 background-color: rgb(255, 255, 255);"><br style=3D"display:initial"></div=
>                                                                          =
                                                                           =
                                              <div style=3D"font-size: init=
ial; font-family: Calibri, 'Slate Pro', sans-serif, sans-serif; color: rgb(=
31, 73, 125); text-align: initial; background-color: rgb(255, 255, 255);">S=
ent&nbsp;from&nbsp;my&nbsp;BlackBerry&nbsp;portable&nbsp;Babbage&nbsp;Devic=
e</div>                                                                    =
                                                                           =
                                   <table width=3D"100%" style=3D"backgroun=
d-color:white;border-spacing:0px;"> <tbody><tr><td colspan=3D"2" style=3D"f=
ont-size: initial; text-align: initial; background-color: rgb(255, 255, 255=
);">                           <div style=3D"border-style: solid none none;=
 border-top-color: rgb(181, 196, 223); border-top-width: 1pt; padding: 3pt =
0in 0in; font-family: Tahoma, 'BB Alpha Sans', 'Slate Pro'; font-size: 10pt=
;">  <div><b>From: </b>Andr=C3=A9</div><div><b>Sent: </b>Wednesday, Februar=
y 10, 2016 10:37 AM</div><div><b>To: </b>ISO C++ Standard - Future Proposal=
s</div><div><b>Reply To: </b>std-proposals@isocpp.org</div><div><b>Subject:=
 </b>[std-proposals] Choosing value categories using a specialized traits c=
lass</div></div></td></tr></tbody></table><div style=3D"border-style: solid=
 none none; border-top-color: rgb(186, 188, 209); border-top-width: 1pt; fo=
nt-size: initial; text-align: initial; background-color: rgb(255, 255, 255)=
;"></div><br><div id=3D"_originalContent" style=3D""><div dir=3D"ltr">Hello=
 everyone,<div><br></div><div>This idea for a proposal comes from discussio=
ns such as&nbsp;<a href=3D"http://stackoverflow.com/questions/3009543/passi=
ng-integers-as-constant-references-versus-copying">this</a>&nbsp;one. There=
 are several situations in STL's API in which integral values are passed by=
 const reference, such as&nbsp;<a href=3D"http://www.cplusplus.com/referenc=
e/vector/vector/insert/">vector's insert</a>&nbsp;for template parameters o=
f integral types. Consider the following code:</div><div><br></div><div><di=
v class=3D"prettyprint" style=3D"border: 1px solid rgb(187, 187, 187); word=
-wrap: break-word; background-color: rgb(250, 250, 250);"><code class=3D"pr=
ettyprint"><div class=3D"subprettyprint"><font color=3D"#660066"><span styl=
e=3D"color: #000;" class=3D"styled-by-prettify">std</span><span style=3D"co=
lor: #660;" class=3D"styled-by-prettify">::</span><span style=3D"color: #00=
0;" class=3D"styled-by-prettify">vector</span><span style=3D"color: #080;" =
class=3D"styled-by-prettify">&lt;int&gt;</span><span style=3D"color: #000;"=
 class=3D"styled-by-prettify"> v</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">;</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify"><br></span><span style=3D"color: #008;" class=3D"styled-by-p=
rettify">int</span><span style=3D"color: #000;" class=3D"styled-by-prettify=
"> a</span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</spa=
n><span style=3D"color: #000;" class=3D"styled-by-prettify"><br><br></span>=
<span style=3D"color: #660;" class=3D"styled-by-prettify">...</span><span s=
tyle=3D"color: #000;" class=3D"styled-by-prettify"><br><br>v</span><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify">.</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify">push_back</span><span style=3D"col=
or: #660;" class=3D"styled-by-prettify">(</span><span style=3D"color: #000;=
" class=3D"styled-by-prettify">a</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">);</span></font></div></code></div><br>I'm not sure=
 to at what extent do compilers optimize this (if at all) by passing "a" by=
 copy instead of using a constant reference. In any case, this idea would s=
olve this problem at the framework level, which seems optimal to me. Consid=
er&nbsp;<a href=3D"http://www.cplusplus.com/reference/vector/vector/push_ba=
ck/">push_back</a>'s signature:<br></div><div><br></div><div><div class=3D"=
prettyprint" style=3D"border: 1px solid rgb(187, 187, 187); word-wrap: brea=
k-word; background-color: rgb(250, 250, 250);"><code class=3D"prettyprint">=
<div class=3D"subprettyprint"><pre style=3D"color: rgb(0, 128, 0); font-siz=
e: 12px; background-color: rgb(250, 255, 250);"><span style=3D"color: #008;=
" class=3D"styled-by-prettify">void</span><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"> push_back </span><span style=3D"color: #660;" cla=
ss=3D"styled-by-prettify">(</span><span style=3D"color: #008;" class=3D"sty=
led-by-prettify">const</span><span style=3D"color: #000;" class=3D"styled-b=
y-prettify"> value_type</span><span style=3D"color: #660;" class=3D"styled-=
by-prettify">&amp;</span><span style=3D"color: #000;" class=3D"styled-by-pr=
ettify"> val</span><span style=3D"color: #660;" class=3D"styled-by-prettify=
">);</span></pre></div></code></div><br>This proposal consists in providing=
 a template <u>traits</u>&nbsp;class that implements a set of typedefs and =
specializes them to provider cleaner and optimal definitions, regarding mul=
tiple situations. Here's a simplified example:</div><div><br></div><div><di=
v class=3D"prettyprint" style=3D"border: 1px solid rgb(187, 187, 187); word=
-wrap: break-word; background-color: rgb(250, 250, 250);"><code class=3D"pr=
ettyprint"><div class=3D"subprettyprint"><p class=3D"p1"><span class=3D"s2"=
 style=3D"font-family: Arial, Helvetica, sans-serif;"><span style=3D"color:=
 #008;" class=3D"styled-by-prettify">template</span></span><span class=3D"s=
1" style=3D"font-family: Arial, Helvetica, sans-serif;"><span style=3D"colo=
r: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;"=
 class=3D"styled-by-prettify">&lt;</span></span><span class=3D"s2" style=3D=
"font-family: Arial, Helvetica, sans-serif;"><span style=3D"color: #008;" c=
lass=3D"styled-by-prettify">class</span></span><span class=3D"s1" style=3D"=
font-family: Arial, Helvetica, sans-serif;"><span style=3D"color: #000;" cl=
ass=3D"styled-by-prettify"> T</span><span style=3D"color: #660;" class=3D"s=
tyled-by-prettify">&gt;</span><span style=3D"color: #000;" class=3D"styled-=
by-prettify"> </span></span><span class=3D"s2" style=3D"font-family: Arial,=
 Helvetica, sans-serif;"><span style=3D"color: #008;" class=3D"styled-by-pr=
ettify">class</span></span><span class=3D"s1" style=3D"font-family: Arial, =
Helvetica, sans-serif;"><span style=3D"color: #000;" class=3D"styled-by-pre=
ttify"> traits</span></span><span style=3D"color: #000;" class=3D"styled-by=
-prettify"><br></span><span class=3D"s1"></span></p><p class=3D"p2"><span c=
lass=3D"s1"><span style=3D"color: #660;" class=3D"styled-by-prettify">{</sp=
an></span></p><p class=3D"p3"><span class=3D"s1"><span style=3D"color: #008=
;" class=3D"styled-by-prettify">public</span></span><span class=3D"s3"><spa=
n style=3D"color: #660;" class=3D"styled-by-prettify">:</span></span></p><p=
 class=3D"p1"><span class=3D"s1"><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify"> &nbsp; &nbsp;</span></span></p><p class=3D"p2"><span class=
=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"> &nbsp; &=
nbsp;</span></span><span class=3D"s2"><span style=3D"color: #008;" class=3D=
"styled-by-prettify">typedef</span></span><span class=3D"s1"><span style=3D=
"color: #000;" class=3D"styled-by-prettify"> T value_type</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">;</span></span></p><p class=
=3D"p1"><span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-=
prettify"> &nbsp; &nbsp;</span></span></p><p class=3D"p2"><span class=3D"s1=
"><span style=3D"color: #000;" class=3D"styled-by-prettify"> &nbsp; &nbsp;<=
/span></span><span class=3D"s2"><span style=3D"color: #008;" class=3D"style=
d-by-prettify">typedef</span></span><span class=3D"s1"><span style=3D"color=
: #000;" class=3D"styled-by-prettify"> </span></span><span class=3D"s4"><sp=
an style=3D"color: #000;" class=3D"styled-by-prettify">value_type</span></s=
pan><span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-pret=
tify"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify">&am=
p;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> referen=
ce</span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</span>=
</span></p><p class=3D"p2"><span class=3D"s1"><span style=3D"color: #000;" =
class=3D"styled-by-prettify"> &nbsp; &nbsp;</span></span><span class=3D"s2"=
><span style=3D"color: #008;" class=3D"styled-by-prettify">typedef</span></=
span><span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-pre=
ttify"> </span></span><span class=3D"s4"><span style=3D"color: #000;" class=
=3D"styled-by-prettify">value_type</span></span><span class=3D"s1"><span st=
yle=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"co=
lor: #660;" class=3D"styled-by-prettify">*</span><span style=3D"color: #000=
;" class=3D"styled-by-prettify"> pointer</span><span style=3D"color: #660;"=
 class=3D"styled-by-prettify">;</span></span></p><p class=3D"p1"><span clas=
s=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"> &nbsp; =
&nbsp;</span></span></p><p class=3D"p2"><span class=3D"s1"><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"> &nbsp; &nbsp;</span></span><span=
 class=3D"s2"><span style=3D"color: #008;" class=3D"styled-by-prettify">typ=
edef</span></span><span class=3D"s1"><span style=3D"color: #000;" class=3D"=
styled-by-prettify"> </span></span><span class=3D"s2"><span style=3D"color:=
 #008;" class=3D"styled-by-prettify">const</span></span><span class=3D"s1">=
<span style=3D"color: #000;" class=3D"styled-by-prettify"> </span></span><s=
pan class=3D"s4"><span style=3D"color: #000;" class=3D"styled-by-prettify">=
value_type</span></span><span class=3D"s1"><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=3D"sty=
led-by-prettify">&amp;</span><span style=3D"color: #000;" class=3D"styled-b=
y-prettify"> const_reference</span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">;</span></span></p><p class=3D"p2"><span class=3D"s1"><sp=
an style=3D"color: #000;" class=3D"styled-by-prettify"> &nbsp; &nbsp;</span=
></span><span class=3D"s2"><span style=3D"color: #008;" class=3D"styled-by-=
prettify">typedef</span></span><span class=3D"s1"><span style=3D"color: #00=
0;" class=3D"styled-by-prettify"> </span></span><span class=3D"s2"><span st=
yle=3D"color: #008;" class=3D"styled-by-prettify">const</span></span><span =
class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"> </s=
pan></span><span class=3D"s4"><span style=3D"color: #000;" class=3D"styled-=
by-prettify">value_type</span></span><span class=3D"s1"><span style=3D"colo=
r: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;"=
 class=3D"styled-by-prettify">*</span><span style=3D"color: #000;" class=3D=
"styled-by-prettify"> const_pointer</span><span style=3D"color: #660;" clas=
s=3D"styled-by-prettify">;</span></span></p><p class=3D"p2"><span class=3D"=
s1"><span style=3D"color: #660;" class=3D"styled-by-prettify">};</span></sp=
an></p></div></code></div><br>In this case, it doesn't do much other than d=
efining some pretty standard stuff. These definitions can be found immensel=
y in STL. The next step would be to provide some more exotic definitions. S=
ome examples:</div><div><ul><li><span style=3D"line-height: normal;"><b>arg=
ument_type</b>&nbsp;solves the problem described. For integral types this w=
ould evaluate to value_type and for class types it would evaluate to const_=
reference.</span></li><li><span style=3D"line-height: normal;"><b>tag_type<=
/b>&nbsp;the generic template would declare an empty struct (tag_type) and =
a constant (tag) of that type. Useful for implementing&nbsp;<a href=3D"http=
://www.generic-programming.org/languages/cpp/techniques.php#tag_dispatching=
">tag dispatching</a>.</span></li></ul><div>I was actually considering incl=
uding other types in this discussion, such as allocator_type, which would "=
recommend" an allocator, but so far these two proposals seem the strongest =
on the table. For instance, recommending an allocator is not as trivial as =
checking a given type, as it also depends on the container (i.e. a "recomme=
ndable" allocator for int will most likely be different for list&lt;int&gt;=
 and vector&lt;int&gt;). Here's what would (probably) be a naive approach t=
o this problem:</div><div><br></div><div><div class=3D"prettyprint" style=
=3D"border: 1px solid rgb(187, 187, 187); word-wrap: break-word; background=
-color: rgb(250, 250, 250);"><code class=3D"prettyprint"><div class=3D"subp=
rettyprint"><p class=3D"p2"><span class=3D"s2"><span style=3D"color: #008;"=
 class=3D"styled-by-prettify">template</span></span><span class=3D"s1"><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">&lt;</span></span><span clas=
s=3D"s2"><span style=3D"color: #008;" class=3D"styled-by-prettify">class</s=
pan></span><span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-=
by-prettify"> T</span><span style=3D"color: #660;" class=3D"styled-by-prett=
ify">&gt;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> =
<br></span></span><span class=3D"s2"><span style=3D"color: #008;" class=3D"=
styled-by-prettify">class</span></span><span class=3D"s1"><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"> _traits_commons</span></span></p>=
<p class=3D"p2"><span class=3D"s1"><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">{</span></span></p><p class=3D"p3"><span class=3D"s1"><sp=
an style=3D"color: #008;" class=3D"styled-by-prettify">public</span></span>=
<span class=3D"s3"><span style=3D"color: #660;" class=3D"styled-by-prettify=
">:</span></span></p><p class=3D"p1"><span style=3D"color: #000;" class=3D"=
styled-by-prettify"><br>&nbsp; &nbsp;</span><span style=3D"color: #800;" cl=
ass=3D"styled-by-prettify">/* Standard stuff */</span></p><p class=3D"p2"><=
span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"=
> &nbsp; &nbsp;</span></span><span class=3D"s2"><span style=3D"color: #008;=
" class=3D"styled-by-prettify">typedef</span></span><span class=3D"s1"><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify"> T value_type</span><=
span style=3D"color: #660;" class=3D"styled-by-prettify">;</span></span></p=
><p class=3D"p2"><span class=3D"s1"><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify"> &nbsp; &nbsp;</span></span><span class=3D"s2"><span sty=
le=3D"color: #008;" class=3D"styled-by-prettify">typedef</span></span><span=
 class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"> </=
span></span><span class=3D"s4"><span style=3D"color: #000;" class=3D"styled=
-by-prettify">value_type</span></span><span class=3D"s1"><span style=3D"col=
or: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;=
" class=3D"styled-by-prettify">&amp;</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"> reference</span><span style=3D"color: #660;" cla=
ss=3D"styled-by-prettify">;</span></span></p><p class=3D"p2"><span class=3D=
"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"> &nbsp; &nbs=
p;</span></span><span class=3D"s2"><span style=3D"color: #008;" class=3D"st=
yled-by-prettify">typedef</span></span><span class=3D"s1"><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"> </span></span><span class=3D"s4">=
<span style=3D"color: #000;" class=3D"styled-by-prettify">value_type</span>=
</span><span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-p=
rettify"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify">=
*</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> pointer<=
/span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</span></s=
pan></p><p class=3D"p2"><span class=3D"s1"><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"> &nbsp; &nbsp;</span></span><span class=3D"s2"><s=
pan style=3D"color: #008;" class=3D"styled-by-prettify">typedef</span></spa=
n><span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy"> </span></span><span class=3D"s2"><span style=3D"color: #008;" class=3D=
"styled-by-prettify">const</span></span><span class=3D"s1"><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"> </span></span><span class=3D"s4"=
><span style=3D"color: #000;" class=3D"styled-by-prettify">value_type</span=
></span><span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-=
prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify"=
>&amp;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> con=
st_reference</span><span style=3D"color: #660;" class=3D"styled-by-prettify=
">;</span></span></p><p class=3D"p2"><span class=3D"s1"><span style=3D"colo=
r: #000;" class=3D"styled-by-prettify"> &nbsp; &nbsp;</span></span><span cl=
ass=3D"s2"><span style=3D"color: #008;" class=3D"styled-by-prettify">typede=
f</span></span><span class=3D"s1"><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"> </span></span><span class=3D"s2"><span style=3D"color: #0=
08;" class=3D"styled-by-prettify">const</span></span><span class=3D"s1"><sp=
an style=3D"color: #000;" class=3D"styled-by-prettify"> </span></span><span=
 class=3D"s4"><span style=3D"color: #000;" class=3D"styled-by-prettify">val=
ue_type</span></span><span class=3D"s1"><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=3D"style=
d-by-prettify">*</span><span style=3D"color: #000;" class=3D"styled-by-pret=
tify"> const_pointer</span><span style=3D"color: #660;" class=3D"styled-by-=
prettify">;</span></span></p><p class=3D"p2"><span class=3D"s1"><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> &nbsp; &nbsp;</span></span>=
<span class=3D"s2"><span style=3D"color: #008;" class=3D"styled-by-prettify=
">typedef</span></span><span class=3D"s1"><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"> </span></span><span class=3D"s5"><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify">std</span></span><span class=3D"s=
1"><span style=3D"color: #660;" class=3D"styled-by-prettify">::</span></spa=
n><span class=3D"s5"><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy">ptrdiff_t</span></span><span class=3D"s1"><span style=3D"color: #000;" =
class=3D"styled-by-prettify"> difference_type</span><span style=3D"color: #=
660;" class=3D"styled-by-prettify">;</span></span></p><p class=3D"p2"><span=
 style=3D"color: #000;" class=3D"styled-by-prettify"><br>&nbsp; &nbsp;</spa=
n><span style=3D"color: #800;" class=3D"styled-by-prettify">/* argument_typ=
e as described */</span></p><p class=3D"p2"><span class=3D"s1"><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> &nbsp; &nbsp;</span></span>=
<span class=3D"s2"><span style=3D"color: #008;" class=3D"styled-by-prettify=
">typedef</span></span><span class=3D"s1"><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"> </span></span><span class=3D"s4"><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify">value_type</span></span><span cla=
ss=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"> argume=
nt_type</span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</=
span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>&nbsp; &=
nbsp;</span><span style=3D"color: #008;" class=3D"styled-by-prettify">typed=
ef</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span>=
<span style=3D"color: #008;" class=3D"styled-by-prettify">const</span><span=
 style=3D"color: #000;" class=3D"styled-by-prettify"> value_type const_argu=
ment_type</span><span style=3D"color: #660;" class=3D"styled-by-prettify">;=
</span></span></p><p class=3D"p1"><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"><br>&nbsp; &nbsp;</span><span style=3D"color: #800;" class=
=3D"styled-by-prettify">/* Tag dispatching */</span></p><p class=3D"p2"><sp=
an class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"> =
&nbsp; &nbsp;</span></span><span class=3D"s2"><span style=3D"color: #008;" =
class=3D"styled-by-prettify">typedef</span></span><span class=3D"s1"><span =
style=3D"color: #000;" class=3D"styled-by-prettify"> </span></span><span cl=
ass=3D"s2"><span style=3D"color: #008;" class=3D"styled-by-prettify">struct=
</span></span><span class=3D"s1"><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-pre=
ttify">{}</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> =
tag_type</span><span style=3D"color: #660;" class=3D"styled-by-prettify">;<=
/span></span></p><p class=3D"p2"><span class=3D"s1"><span style=3D"color: #=
000;" class=3D"styled-by-prettify"> &nbsp; &nbsp;</span></span><span class=
=3D"s2"><span style=3D"color: #008;" class=3D"styled-by-prettify">static</s=
pan></span><span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-=
by-prettify"> </span></span><span class=3D"s2"><span style=3D"color: #008;"=
 class=3D"styled-by-prettify">const</span></span><span class=3D"s1"><span s=
tyle=3D"color: #000;" class=3D"styled-by-prettify"> </span></span><span cla=
ss=3D"s4"><span style=3D"color: #000;" class=3D"styled-by-prettify">tag_typ=
e</span></span><span class=3D"s1"><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"> tag</span><span style=3D"color: #660;" class=3D"styled-by=
-prettify">;</span></span></p><p class=3D"p2"><span class=3D"s1"><span styl=
e=3D"color: #660;" class=3D"styled-by-prettify">};</span></span></p><p clas=
s=3D"p1"><span style=3D"color: #000;" class=3D"styled-by-prettify"><br></sp=
an><span class=3D"s1"></span></p><p class=3D"p3"><span class=3D"s1"><span s=
tyle=3D"color: #008;" class=3D"styled-by-prettify">template</span></span><s=
pan class=3D"s3"><span style=3D"color: #000;" class=3D"styled-by-prettify">=
 </span><span style=3D"color: #660;" class=3D"styled-by-prettify">&lt;</spa=
n></span><span class=3D"s1"><span style=3D"color: #008;" class=3D"styled-by=
-prettify">class</span></span><span class=3D"s3"><span style=3D"color: #000=
;" class=3D"styled-by-prettify"> T</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">,</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify"> </span></span><span class=3D"s1"><span style=3D"color: #008=
;" class=3D"styled-by-prettify">class</span></span><span class=3D"s3"><span=
 style=3D"color: #000;" class=3D"styled-by-prettify"> E </span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">=3D</span><span style=3D"col=
or: #000;" class=3D"styled-by-prettify"> </span></span><span class=3D"s1"><=
span style=3D"color: #008;" class=3D"styled-by-prettify">void</span></span>=
<span class=3D"s3"><span style=3D"color: #660;" class=3D"styled-by-prettify=
">&gt;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> <br=
></span></span><span class=3D"s1"><span style=3D"color: #008;" class=3D"sty=
led-by-prettify">class</span></span><span class=3D"s3"><span style=3D"color=
: #000;" class=3D"styled-by-prettify"> traits</span></span></p><p class=3D"=
p4"><span class=3D"s3"><span style=3D"color: #000;" class=3D"styled-by-pret=
tify"> &nbsp; &nbsp;</span><span style=3D"color: #660;" class=3D"styled-by-=
prettify">:</span><span style=3D"color: #000;" class=3D"styled-by-prettify"=
> </span></span><span class=3D"s2"><span style=3D"color: #008;" class=3D"st=
yled-by-prettify">public</span></span><span class=3D"s3"><span style=3D"col=
or: #000;" class=3D"styled-by-prettify"> </span></span><span class=3D"s1"><=
span style=3D"color: #000;" class=3D"styled-by-prettify">_traits_commons</s=
pan></span><span class=3D"s3"><span style=3D"color: #660;" class=3D"styled-=
by-prettify">&lt;</span><span style=3D"color: #000;" class=3D"styled-by-pre=
ttify">T</span><span style=3D"color: #660;" class=3D"styled-by-prettify">&g=
t;</span></span></p><p class=3D"p2"><span class=3D"s1"><span style=3D"color=
: #660;" class=3D"styled-by-prettify">{</span></span></p><p class=3D"p3"><s=
pan class=3D"s1"><span style=3D"color: #008;" class=3D"styled-by-prettify">=
private</span></span><span class=3D"s3"><span style=3D"color: #660;" class=
=3D"styled-by-prettify">:</span></span></p><p class=3D"p1"><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"><br></span></p><p class=3D"p2"><s=
pan class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify">=
&nbsp; &nbsp; </span></span><span class=3D"s2"><span style=3D"color: #008;"=
 class=3D"styled-by-prettify">typedef</span></span><span class=3D"s1"><span=
 style=3D"color: #000;" class=3D"styled-by-prettify"> </span></span><span c=
lass=3D"s4"><span style=3D"color: #000;" class=3D"styled-by-prettify">_trai=
ts_commons</span></span><span class=3D"s1"><span style=3D"color: #660;" cla=
ss=3D"styled-by-prettify">&lt;</span><span style=3D"color: #000;" class=3D"=
styled-by-prettify">T</span><span style=3D"color: #660;" class=3D"styled-by=
-prettify">&gt;</span><span style=3D"color: #000;" class=3D"styled-by-prett=
ify"> _base_type</span><span style=3D"color: #660;" class=3D"styled-by-pret=
tify">;</span></span></p><p class=3D"p1"><span style=3D"color: #000;" class=
=3D"styled-by-prettify"><br></span></p><p class=3D"p3"><span class=3D"s1"><=
span style=3D"color: #008;" class=3D"styled-by-prettify">public</span></spa=
n><span class=3D"s3"><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">:</span></span></p><p class=3D"p1"><span style=3D"color: #000;" class=
=3D"styled-by-prettify"><br></span></p><p class=3D"p2"><span class=3D"s1"><=
span style=3D"color: #000;" class=3D"styled-by-prettify">&nbsp; &nbsp;</spa=
n></span><span class=3D"s2"><span style=3D"color: #008;" class=3D"styled-by=
-prettify">typedef</span></span><span class=3D"s1"><span style=3D"color: #0=
00;" class=3D"styled-by-prettify"> </span></span><span class=3D"s2"><span s=
tyle=3D"color: #008;" class=3D"styled-by-prettify">typename</span></span><s=
pan class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify">=
 </span></span><span class=3D"s4"><span style=3D"color: #000;" class=3D"sty=
led-by-prettify">_base_type</span></span><span class=3D"s1"><span style=3D"=
color: #660;" class=3D"styled-by-prettify">::</span><span style=3D"color: #=
000;" class=3D"styled-by-prettify">value_type value_type</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">;</span></span></p><p class=
=3D"p2"><span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-=
prettify"> &nbsp; &nbsp;</span></span><span class=3D"s2"><span style=3D"col=
or: #008;" class=3D"styled-by-prettify">typedef</span></span><span class=3D=
"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span></sp=
an><span class=3D"s2"><span style=3D"color: #008;" class=3D"styled-by-prett=
ify">typename</span></span><span class=3D"s1"><span style=3D"color: #000;" =
class=3D"styled-by-prettify"> </span></span><span class=3D"s4"><span style=
=3D"color: #000;" class=3D"styled-by-prettify">_base_type</span></span><spa=
n class=3D"s1"><span style=3D"color: #660;" class=3D"styled-by-prettify">::=
</span><span style=3D"color: #000;" class=3D"styled-by-prettify">reference =
reference</span><span style=3D"color: #660;" class=3D"styled-by-prettify">;=
</span></span></p><p class=3D"p2"><span class=3D"s1"><span style=3D"color: =
#000;" class=3D"styled-by-prettify"> &nbsp; &nbsp;</span></span><span class=
=3D"s2"><span style=3D"color: #008;" class=3D"styled-by-prettify">typedef</=
span></span><span class=3D"s1"><span style=3D"color: #000;" class=3D"styled=
-by-prettify"> </span></span><span class=3D"s2"><span style=3D"color: #008;=
" class=3D"styled-by-prettify">typename</span></span><span class=3D"s1"><sp=
an style=3D"color: #000;" class=3D"styled-by-prettify"> </span></span><span=
 class=3D"s4"><span style=3D"color: #000;" class=3D"styled-by-prettify">_ba=
se_type</span></span><span class=3D"s1"><span style=3D"color: #660;" class=
=3D"styled-by-prettify">::</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify">pointer pointer</span><span style=3D"color: #660;" class=3D=
"styled-by-prettify">;</span></span></p><p class=3D"p2"><span class=3D"s1">=
<span style=3D"color: #000;" class=3D"styled-by-prettify"> &nbsp; &nbsp;</s=
pan></span><span class=3D"s2"><span style=3D"color: #008;" class=3D"styled-=
by-prettify">typedef</span></span><span class=3D"s1"><span style=3D"color: =
#000;" class=3D"styled-by-prettify"> </span></span><span class=3D"s2"><span=
 style=3D"color: #008;" class=3D"styled-by-prettify">typename</span></span>=
<span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify=
"> </span></span><span class=3D"s4"><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify">_base_type</span></span><span class=3D"s1"><span style=
=3D"color: #660;" class=3D"styled-by-prettify">::</span><span style=3D"colo=
r: #000;" class=3D"styled-by-prettify">const_reference const_reference</spa=
n><span style=3D"color: #660;" class=3D"styled-by-prettify">;</span></span>=
</p><p class=3D"p2"><span class=3D"s1"><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> &nbsp; &nbsp;</span></span><span class=3D"s2"><spa=
n style=3D"color: #008;" class=3D"styled-by-prettify">typedef</span></span>=
<span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify=
"> </span></span><span class=3D"s2"><span style=3D"color: #008;" class=3D"s=
tyled-by-prettify">typename</span></span><span class=3D"s1"><span style=3D"=
color: #000;" class=3D"styled-by-prettify"> </span></span><span class=3D"s4=
"><span style=3D"color: #000;" class=3D"styled-by-prettify">_base_type</spa=
n></span><span class=3D"s1"><span style=3D"color: #660;" class=3D"styled-by=
-prettify">::</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y">const_pointer const_pointer</span><span style=3D"color: #660;" class=3D"=
styled-by-prettify">;</span></span></p><p class=3D"p2"><span class=3D"s1"><=
span style=3D"color: #000;" class=3D"styled-by-prettify"> &nbsp; &nbsp;</sp=
an></span><span class=3D"s2"><span style=3D"color: #008;" class=3D"styled-b=
y-prettify">typedef</span></span><span class=3D"s1"><span style=3D"color: #=
000;" class=3D"styled-by-prettify"> </span></span><span class=3D"s2"><span =
style=3D"color: #008;" class=3D"styled-by-prettify">typename</span></span><=
span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"=
> </span></span><span class=3D"s4"><span style=3D"color: #000;" class=3D"st=
yled-by-prettify">_base_type</span></span><span class=3D"s1"><span style=3D=
"color: #660;" class=3D"styled-by-prettify">::</span><span style=3D"color: =
#000;" class=3D"styled-by-prettify">difference_type difference_type</span><=
span style=3D"color: #660;" class=3D"styled-by-prettify">;</span></span></p=
><p class=3D"p2"><span style=3D"color: #000;" class=3D"styled-by-prettify">=
<br></span></p><p class=3D"p2"><span class=3D"s1"><span style=3D"color: #00=
0;" class=3D"styled-by-prettify">&nbsp; &nbsp;</span></span><span class=3D"=
s2"><span style=3D"color: #008;" class=3D"styled-by-prettify">typedef</span=
></span><span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-=
prettify"> </span></span><span class=3D"s2"><span style=3D"color: #008;" cl=
ass=3D"styled-by-prettify">typename</span></span><span class=3D"s1"><span s=
tyle=3D"color: #000;" class=3D"styled-by-prettify"> </span></span><span cla=
ss=3D"s4"><span style=3D"color: #000;" class=3D"styled-by-prettify">_base_t=
ype</span></span><span class=3D"s1"><span style=3D"color: #660;" class=3D"s=
tyled-by-prettify">::</span><span style=3D"color: #000;" class=3D"styled-by=
-prettify">argument_type argument_type</span><span style=3D"color: #660;" c=
lass=3D"styled-by-prettify">;</span><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify"><br>&nbsp; &nbsp;</span><span style=3D"color: #008;" cla=
ss=3D"styled-by-prettify">typedef</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> </span><font color=3D"#000088"><span style=3D"colo=
r: #008;" class=3D"styled-by-prettify">typename</span><span style=3D"color:=
 #000;" class=3D"styled-by-prettify"> _base_type</span><span style=3D"color=
: #660;" class=3D"styled-by-prettify">::</span><span style=3D"color: #000;"=
 class=3D"styled-by-prettify">const_argument_type const_argument_type</span=
><span style=3D"color: #660;" class=3D"styled-by-prettify">;</span></font><=
span style=3D"color: #000;" class=3D"styled-by-prettify"><br>&nbsp; &nbsp;<=
/span><span style=3D"color: #008;" class=3D"styled-by-prettify">typedef</sp=
an><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span =
style=3D"color: #008;" class=3D"styled-by-prettify">typename</span><span st=
yle=3D"color: #000;" class=3D"styled-by-prettify"> _base_type</span><span s=
tyle=3D"color: #660;" class=3D"styled-by-prettify">::</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify">tag_type tag_type</span><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify">;</span></span></p><p cla=
ss=3D"p2"><span class=3D"s1"><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">};</span></span></p><span style=3D"color: #000;" class=3D"style=
d-by-prettify"><br></span><p class=3D"p2"><span class=3D"s2"><span style=3D=
"color: #008;" class=3D"styled-by-prettify">template</span></span><span cla=
ss=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span=
><span style=3D"color: #660;" class=3D"styled-by-prettify">&lt;</span></spa=
n><span class=3D"s2"><span style=3D"color: #008;" class=3D"styled-by-pretti=
fy">class</span></span><span class=3D"s1"><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"> T</span><span style=3D"color: #660;" class=3D"sty=
led-by-prettify">&gt;</span><span style=3D"color: #000;" class=3D"styled-by=
-prettify"> <br></span></span><span class=3D"s2"><span style=3D"color: #008=
;" class=3D"styled-by-prettify">class</span></span><span class=3D"s1"><span=
 style=3D"color: #000;" class=3D"styled-by-prettify"> traits</span><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify">&lt;</span><span style=3D=
"color: #000;" class=3D"styled-by-prettify">T</span><span style=3D"color: #=
660;" class=3D"styled-by-prettify">,</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"> </span></span><span class=3D"s2"><span style=3D"=
color: #008;" class=3D"styled-by-prettify">typename</span></span><span clas=
s=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span>=
</span><span class=3D"s5"><span style=3D"color: #000;" class=3D"styled-by-p=
rettify">std</span></span><span class=3D"s1"><span style=3D"color: #660;" c=
lass=3D"styled-by-prettify">::</span></span><span class=3D"s5"><span style=
=3D"color: #000;" class=3D"styled-by-prettify">enable_if</span></span><span=
 class=3D"s1"><span style=3D"color: #660;" class=3D"styled-by-prettify">&lt=
;</span></span><span class=3D"s5"><span style=3D"color: #000;" class=3D"sty=
led-by-prettify">std</span></span><span class=3D"s1"><span style=3D"color: =
#660;" class=3D"styled-by-prettify">::</span></span><span class=3D"s5"><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify">is_class</span></span=
><span class=3D"s1"><span style=3D"color: #660;" class=3D"styled-by-prettif=
y">&lt;</span><span style=3D"color: #000;" class=3D"styled-by-prettify">T</=
span><span style=3D"color: #660;" class=3D"styled-by-prettify">&gt;::</span=
><span style=3D"color: #000;" class=3D"styled-by-prettify">value</span><spa=
n style=3D"color: #660;" class=3D"styled-by-prettify">&gt;::</span><span st=
yle=3D"color: #000;" class=3D"styled-by-prettify">type</span><span style=3D=
"color: #660;" class=3D"styled-by-prettify">&gt;</span></span></p><p class=
=3D"p4"><span class=3D"s3"><span style=3D"color: #000;" class=3D"styled-by-=
prettify"> &nbsp; &nbsp;</span><span style=3D"color: #660;" class=3D"styled=
-by-prettify">:</span><span style=3D"color: #000;" class=3D"styled-by-prett=
ify"> </span></span><span class=3D"s2"><span style=3D"color: #008;" class=
=3D"styled-by-prettify">public</span></span><span class=3D"s3"><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> </span></span><span class=
=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify">_traits_c=
ommons</span></span><span class=3D"s3"><span style=3D"color: #660;" class=
=3D"styled-by-prettify">&lt;</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify">T</span><span style=3D"color: #660;" class=3D"styled-by-p=
rettify">&gt;</span></span></p><p class=3D"p2"><span class=3D"s1"><span sty=
le=3D"color: #660;" class=3D"styled-by-prettify">{</span></span></p><p clas=
s=3D"p3"><span class=3D"s1"><span style=3D"color: #008;" class=3D"styled-by=
-prettify">private</span></span><span class=3D"s3"><span style=3D"color: #6=
60;" class=3D"styled-by-prettify">:</span></span></p><p class=3D"p2"><span =
class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"> <br=
>&nbsp; &nbsp;</span></span><span class=3D"s2"><span style=3D"color: #008;"=
 class=3D"styled-by-prettify">typedef</span></span><span class=3D"s1"><span=
 style=3D"color: #000;" class=3D"styled-by-prettify"> </span></span><span c=
lass=3D"s4"><span style=3D"color: #000;" class=3D"styled-by-prettify">_trai=
ts_commons</span></span><span class=3D"s1"><span style=3D"color: #660;" cla=
ss=3D"styled-by-prettify">&lt;</span><span style=3D"color: #000;" class=3D"=
styled-by-prettify">T</span><span style=3D"color: #660;" class=3D"styled-by=
-prettify">&gt;</span><span style=3D"color: #000;" class=3D"styled-by-prett=
ify"> _base_type</span><span style=3D"color: #660;" class=3D"styled-by-pret=
tify">;</span></span></p><p class=3D"p1"><span style=3D"color: #000;" class=
=3D"styled-by-prettify"><br></span></p><p class=3D"p3"><span class=3D"s1"><=
span style=3D"color: #008;" class=3D"styled-by-prettify">public</span></spa=
n><span class=3D"s3"><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">:</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br><=
br></span></span></p><p class=3D"p2"><span class=3D"s1"><span style=3D"colo=
r: #000;" class=3D"styled-by-prettify">&nbsp; &nbsp;</span></span><span cla=
ss=3D"s2"><span style=3D"color: #008;" class=3D"styled-by-prettify">typedef=
</span></span><span class=3D"s1"><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify"> </span></span><span class=3D"s2"><span style=3D"color: #00=
8;" class=3D"styled-by-prettify">typename</span></span><span class=3D"s1"><=
span style=3D"color: #000;" class=3D"styled-by-prettify"> </span></span><sp=
an class=3D"s4"><span style=3D"color: #000;" class=3D"styled-by-prettify">_=
base_type</span></span><span class=3D"s1"><span style=3D"color: #660;" clas=
s=3D"styled-by-prettify">::</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify">value_type value_type</span><span style=3D"color: #660;" c=
lass=3D"styled-by-prettify">;</span></span></p><p class=3D"p2"><span class=
=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"> &nbsp; &=
nbsp;</span></span><span class=3D"s2"><span style=3D"color: #008;" class=3D=
"styled-by-prettify">typedef</span></span><span class=3D"s1"><span style=3D=
"color: #000;" class=3D"styled-by-prettify"> </span></span><span class=3D"s=
2"><span style=3D"color: #008;" class=3D"styled-by-prettify">typename</span=
></span><span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-=
prettify"> </span></span><span class=3D"s4"><span style=3D"color: #000;" cl=
ass=3D"styled-by-prettify">_base_type</span></span><span class=3D"s1"><span=
 style=3D"color: #660;" class=3D"styled-by-prettify">::</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify">reference reference</span><s=
pan style=3D"color: #660;" class=3D"styled-by-prettify">;</span></span></p>=
<p class=3D"p2"><span class=3D"s1"><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"> &nbsp; &nbsp;</span></span><span class=3D"s2"><span styl=
e=3D"color: #008;" class=3D"styled-by-prettify">typedef</span></span><span =
class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"> </s=
pan></span><span class=3D"s2"><span style=3D"color: #008;" class=3D"styled-=
by-prettify">typename</span></span><span class=3D"s1"><span style=3D"color:=
 #000;" class=3D"styled-by-prettify"> </span></span><span class=3D"s4"><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify">_base_type</span></sp=
an><span class=3D"s1"><span style=3D"color: #660;" class=3D"styled-by-prett=
ify">::</span><span style=3D"color: #000;" class=3D"styled-by-prettify">poi=
nter pointer</span><span style=3D"color: #660;" class=3D"styled-by-prettify=
">;</span></span></p><p class=3D"p2"><span class=3D"s1"><span style=3D"colo=
r: #000;" class=3D"styled-by-prettify"> &nbsp; &nbsp;</span></span><span cl=
ass=3D"s2"><span style=3D"color: #008;" class=3D"styled-by-prettify">typede=
f</span></span><span class=3D"s1"><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"> </span></span><span class=3D"s2"><span style=3D"color: #0=
08;" class=3D"styled-by-prettify">typename</span></span><span class=3D"s1">=
<span style=3D"color: #000;" class=3D"styled-by-prettify"> </span></span><s=
pan class=3D"s4"><span style=3D"color: #000;" class=3D"styled-by-prettify">=
_base_type</span></span><span class=3D"s1"><span style=3D"color: #660;" cla=
ss=3D"styled-by-prettify">::</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify">const_reference const_reference</span><span style=3D"colo=
r: #660;" class=3D"styled-by-prettify">;</span></span></p><p class=3D"p2"><=
span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"=
> &nbsp; &nbsp;</span></span><span class=3D"s2"><span style=3D"color: #008;=
" class=3D"styled-by-prettify">typedef</span></span><span class=3D"s1"><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify"> </span></span><span =
class=3D"s2"><span style=3D"color: #008;" class=3D"styled-by-prettify">type=
name</span></span><span class=3D"s1"><span style=3D"color: #000;" class=3D"=
styled-by-prettify"> </span></span><span class=3D"s4"><span style=3D"color:=
 #000;" class=3D"styled-by-prettify">_base_type</span></span><span class=3D=
"s1"><span style=3D"color: #660;" class=3D"styled-by-prettify">::</span><sp=
an style=3D"color: #000;" class=3D"styled-by-prettify">const_pointer const_=
pointer</span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</=
span></span></p><p class=3D"p2"><span class=3D"s1"><span style=3D"color: #0=
00;" class=3D"styled-by-prettify"> &nbsp; &nbsp;</span></span><span class=
=3D"s2"><span style=3D"color: #008;" class=3D"styled-by-prettify">typedef</=
span></span><span class=3D"s1"><span style=3D"color: #000;" class=3D"styled=
-by-prettify"> </span></span><span class=3D"s2"><span style=3D"color: #008;=
" class=3D"styled-by-prettify">typename</span></span><span class=3D"s1"><sp=
an style=3D"color: #000;" class=3D"styled-by-prettify"> </span></span><span=
 class=3D"s4"><span style=3D"color: #000;" class=3D"styled-by-prettify">_ba=
se_type</span></span><span class=3D"s1"><span style=3D"color: #660;" class=
=3D"styled-by-prettify">::</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify">size_type size_type</span><span style=3D"color: #660;" clas=
s=3D"styled-by-prettify">;</span></span></p><p class=3D"p2"><span class=3D"=
s1"><span style=3D"color: #000;" class=3D"styled-by-prettify"> &nbsp; &nbsp=
;</span></span><span class=3D"s2"><span style=3D"color: #008;" class=3D"sty=
led-by-prettify">typedef</span></span><span class=3D"s1"><span style=3D"col=
or: #000;" class=3D"styled-by-prettify"> </span></span><span class=3D"s2"><=
span style=3D"color: #008;" class=3D"styled-by-prettify">typename</span></s=
pan><span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-pret=
tify"> </span></span><span class=3D"s4"><span style=3D"color: #000;" class=
=3D"styled-by-prettify">_base_type</span></span><span class=3D"s1"><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify">::</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify">difference_type difference_type</=
span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</span></sp=
an></p><p class=3D"p2"><span class=3D"s1"><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"> &nbsp; &nbsp;</span></span><span class=3D"s2"><sp=
an style=3D"color: #008;" class=3D"styled-by-prettify">typedef</span></span=
><span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"> </span></span><span class=3D"s2"><span style=3D"color: #008;" class=3D"=
styled-by-prettify">typename</span></span><span class=3D"s1"><span style=3D=
"color: #000;" class=3D"styled-by-prettify"> </span></span><span class=3D"s=
4"><span style=3D"color: #000;" class=3D"styled-by-prettify">_base_type</sp=
an></span><span class=3D"s1"><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">::</span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy">return_type return_type</span><span style=3D"color: #660;" class=3D"sty=
led-by-prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-pr=
ettify"><br><br>&nbsp; &nbsp;</span><span style=3D"color: #800;" class=3D"s=
tyled-by-prettify">/* Enabled if std::is_class&lt;T&gt; (discussible). Noti=
ce that argument_type is now a reference */</span></span></p><p class=3D"p2=
"><span class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy"> &nbsp; &nbsp;</span></span><span class=3D"s2"><span style=3D"color: #0=
08;" class=3D"styled-by-prettify">typedef</span></span><span class=3D"s1"><=
span style=3D"color: #000;" class=3D"styled-by-prettify"> </span></span><sp=
an class=3D"s4"><span style=3D"color: #000;" class=3D"styled-by-prettify">r=
eference</span></span><span class=3D"s1"><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> argument_type</span><span style=3D"color: #660;" c=
lass=3D"styled-by-prettify">;</span><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify"><br></span></span></p><p class=3D"p2"><span class=3D"s1"=
><span style=3D"color: #000;" class=3D"styled-by-prettify">&nbsp; &nbsp;</s=
pan><span style=3D"color: #008;" class=3D"styled-by-prettify">typedef</span=
><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><font co=
lor=3D"#000088"><span style=3D"color: #008;" class=3D"styled-by-prettify">c=
onst</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> refer=
ence</span></font><font color=3D"#000088"><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"> const_argument_type</span><span style=3D"color: #=
660;" class=3D"styled-by-prettify">;</span></font><span style=3D"color: #00=
0;" class=3D"styled-by-prettify"><br></span></span></p><p class=3D"p2"><spa=
n class=3D"s1"><span style=3D"color: #000;" class=3D"styled-by-prettify">&n=
bsp; &nbsp;</span></span><span style=3D"color: #008;" class=3D"styled-by-pr=
ettify">typedef</span><span style=3D"color: #000;" class=3D"styled-by-prett=
ify"> </span><span style=3D"color: #008;" class=3D"styled-by-prettify">type=
name</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> _base=
_type</span><span style=3D"color: #660;" class=3D"styled-by-prettify">::</s=
pan><span style=3D"color: #000;" class=3D"styled-by-prettify">tag_type tag_=
type</span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</spa=
n></p><p class=3D"p2"><span class=3D"s1"><span style=3D"color: #660;" class=
=3D"styled-by-prettify">};</span></span></p></div></code></div><br>This is =
obviously a simplification,&nbsp;but I believe it works to demonstrate my i=
ntents. Getting back to the previous examples, push_back would now be decla=
red like this:</div><div><br></div><div><div class=3D"prettyprint" style=3D=
"border: 1px solid rgb(187, 187, 187); word-wrap: break-word; background-co=
lor: rgb(250, 250, 250);"><code class=3D"prettyprint"><div class=3D"subpret=
typrint"><pre style=3D"font-size: 12px; background-color: rgb(250, 255, 250=
);"><span style=3D"color: #008;" class=3D"styled-by-prettify">void</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"> push_back </span><=
span style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span styl=
e=3D"color: #008;" class=3D"styled-by-prettify">typename</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> traits</span><span style=3D=
"color: #660;" class=3D"styled-by-prettify">&lt;</span><font color=3D"#0000=
00"><span style=3D"color: #000;" class=3D"styled-by-prettify">T</span><span=
 style=3D"color: #660;" class=3D"styled-by-prettify">&gt;::</span><span sty=
le=3D"color: #000;" class=3D"styled-by-prettify">const_argument_type val</s=
pan></font><span style=3D"color: #660;" class=3D"styled-by-prettify">);</sp=
an></pre></div></code></div><br>This would mean a pass-by-copy for non-clas=
s types and a const_reference for class types. By using this approach I bel=
ieve that argument passing can be cleaner and more efficient. Has this been=
 proposed before? What do you think? I've been thinking about making a prop=
osal to the C++ committee and though of following their recommendation of p=
osting on the forums first :)</div><div><br></div><div>Thank you immensely =
in advance for your feedback,</div><div>Happy coding!</div><div><br></div><=
/div></div>

<p></p>

-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"https://groups.google.com/a/isocpp.org/group=
/std-proposals/">https://groups.google.com/a/isocpp.org/group/std-proposals=
/</a>.<br>
<br><!--end of _originalContent --></div></body></html>

<p></p>

-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals&quot; group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"https://groups.google.com/a/isocpp.org/group=
/std-proposals/">https://groups.google.com/a/isocpp.org/group/std-proposals=
/</a>.<br />

.
