Topic: Improve fundamentals of parameter packs


Author: Daniel Frey <d.frey@gmx.de>
Date: Sun, 28 Feb 2016 22:32:52 +0100
Raw View
--Apple-Mail=_3DF3200F-CD2C-41F2-AEC5-1B057CC4B857
Content-Type: multipart/alternative;
 boundary="Apple-Mail=_0FBD0648-BDF2-4A6E-AF0E-4D11C1AF4CD7"

--Apple-Mail=_0FBD0648-BDF2-4A6E-AF0E-4D11C1AF4CD7
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8

I=E2=80=99d like to propose three basic functionalities wrt parameter packs=
..

1) Allow expansion of only a single element via pattern...[I].
2) Allow in-situ creation of unexpanded non-type parameter packs via Type..=
.. N.
3) Allow aliases via using Is =3D std::size_t... 5.

I think that those are the fundamentals missing for efficient implementatio=
n of variadic functions dealing with parameter packs.

I attached a first draft of a formal proposal. Any feedback welcome.

Daniel

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/7199947E-F020-402B-B5FC-D747CE6224FC%40gmx.de.

--Apple-Mail=_0FBD0648-BDF2-4A6E-AF0E-4D11C1AF4CD7
Content-Type: multipart/mixed;
 boundary="Apple-Mail=_0EC48875-5CBD-491A-BDCC-BBC12DB90ADE"

--Apple-Mail=_0EC48875-5CBD-491A-BDCC-BBC12DB90ADE
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8

<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D""><font face=3D"Helv=
etica" class=3D"">I=E2=80=99d like to propose three basic functionalities w=
rt parameter packs.</font><div class=3D""><font face=3D"Helvetica" class=3D=
""><br class=3D""></font></div><div class=3D"">1) Allow expansion of only a=
 single element via <font face=3D"Courier" class=3D"">pattern...[I]</font>.=
</div><div class=3D""><div class=3D""><font face=3D"Helvetica" class=3D"">2=
) Allow in-situ creation of unexpanded non-type parameter packs via&nbsp;</=
font><font face=3D"Courier" class=3D"">Type... N</font><font face=3D"Helvet=
ica" class=3D"">.</font></div></div><div class=3D""><font face=3D"Helvetica=
" class=3D"">3) Allow aliases via </font><font face=3D"Courier" class=3D"">=
using Is =3D std::size_t... 5</font><font face=3D"Helvetica" class=3D"">.</=
font></div><div class=3D""><font face=3D"Helvetica" class=3D""><br class=3D=
""></font></div><div class=3D""><font face=3D"Helvetica" class=3D"">I think=
 that those are the fundamentals missing for efficient implementation of va=
riadic functions dealing with parameter packs.</font></div><div class=3D"">=
<font face=3D"Helvetica" class=3D""><br class=3D""></font></div><div class=
=3D""><font face=3D"Helvetica" class=3D"">I attached a first draft of a for=
mal proposal. Any feedback welcome.</font></div><div class=3D""><font face=
=3D"Helvetica" class=3D""><br class=3D""></font></div><div class=3D""><font=
 face=3D"Helvetica" class=3D"">Daniel</font></div><div class=3D""><font fac=
e=3D"Helvetica" class=3D""><br class=3D""></font></div><div class=3D""></di=
v></body></html>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/7199947E-F020-402B-B5FC-D747CE6224FC%=
40gmx.de?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.com/=
a/isocpp.org/d/msgid/std-proposals/7199947E-F020-402B-B5FC-D747CE6224FC%40g=
mx.de</a>.<br />

--Apple-Mail=_0EC48875-5CBD-491A-BDCC-BBC12DB90ADE
Content-Disposition: inline;
 filename="Improve Variadic Templates.pdf"
Content-Type: application/pdf;
 x-unix-mode=0644;
 name="Improve Variadic Templates.pdf"
Content-Transfer-Encoding: base64

JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDwgL0xlbmd0aCA1IDAgUiAvRmlsdGVyIC9G
bGF0ZURlY29kZSA+PgpzdHJlYW0KeAGdnNuS28YRhu/xFBNfYUtamAAJcqlKJXFsxaVUkrKtrdKF
5UrJ9PokUZHItSzlffxIudWzpAnM//UQA3Aply6WwvT04e/D9MyAfB2+DK/DzP6167ZqrsLVoq6u
1mF3E56El+HjT/d12OxD3f3bb4wuEmxtwlL/eXH4T3E5q+rZen3VLsILIzz674/h+07SYl0tFs26
CW1b1c1ytQ6L9bKarxdNWM2b6qqZzU12kco+KDcLJvu1KXH4WId2FVarNmy24a/XoY5P+z/X2/Dx
9fVB3+vvw9eh/OzioFcTyv9cHDSyD5tf9Gl7o08v9eH2InREIf5lIE4qyu23omX27sFg1p8vwjfh
+u/h4bUZbRg2BwxHbFg2RW+DCDuwJwxerE8bXMjgaOcz6Smb0HeobiPKWf+hKGs9WerDZRwL5Tx/
ZOTj9hbHPpsvownn2NvMx+wthg7+Yodnf5ZmWLqR7UOTD7NiYPygWTsQ225/0kMCADKFxj9E8kyc
clpCDdawQUfx+7TnV5T37t0fxNPDN9j4QlJhLRNRGdqXUkwinlyEelWtkmTYPWdarr2mfd6pU5SO
NMJfTXl+kK31LPF8obIyHunL9WrM82Ho+a8EGFCaNn2Og9K7S8EDKsNQ+EyTcj+CDRJgLGz+Fl21
g+RdP1SUf/xOnKtI9H1O/JeOpg4lgbF9K/I4vyjh/afz4F5eLRK4qeKzYqySLlslWrPu6mv808Pd
UEkfReW3vVVFaWh3tXInMw3i7sEbPUBvocUI+RAnF6Vh3U1mxKzvHmhgI65iJvnMgBdPoq7BEbxF
J9Se5LdR/jyX6P2Z+OeFruhWgFH8a1ayq3596/9M4W9Z3eFyiwHCXYhZdnYUIHYrDEVpuR4LdnFq
gVrObEHqFtkzCnZ7dRVXs9Mr8j/JxL1yUx6grOxvBP1eY8xSEmlATHDsdlgGipKAyIjFhTmQJssB
rG8j9jzYTc/fPEd3Lw6vFUm/yEBzTV+znEg8peyPIkGsKKLWiYGb5xrTbIDTQN7A+EhcE73SP0cm
64OoKW9I+FWKRtqiFC1WwmVSPUhFEWEsyg2C4EIIZbOIpdwAedGU87blqFNpz+wuCVPWBaSdaC73
VUxQodMvIoX3qITVHpOdn2Y5HNstZBnye5DJ8iIpi/Ak/C0Fu8AsSsL4aYmZMPX4EIuPSCWIFJRF
KZ9Oh/S/FEMZqQREFa0fYc3E2Y4SISI+Hz29EAc9ilp0i0+fhNjq2ZikbMxU7HKikRg9BfdbWEiV
Q9cwFYxsE04X1qde5jCeHJXpFjQxx10/lMG9RDGBmJhKrFHDdhsm7B1lZMN/T2h4gaGEwXYnTJjH
EHYRpqJFgaDlMeYYc4WAZkyHoChoCPcU1UyuuMINCnSNOBRllbp4elvYstObWHWLZB/c0mqcDo6v
lFYApX2w5ZHXiDcMyzCc4PGSh4nSriix2kGMWaMHMMQzzCH7CFLij1kQ5+HlMcq+L05LSivzEYbH
fL6MR0U1HVo6gAl2mkIpUgENJZreP6r7RclKzCSBJG76P+GF4LjNCCVFDDtyJ7ouPub9Df7spRYl
6zjS4P0cgxnbO/e9ba68ih1CvO97h6c3LZv7iRD3o55ltVx3B0azq2rVLNd395jlbxfh+uf+8MVX
9eUytOxCj3IlO1J4FN0k8P/XbZsXwVdCbH9LRYuPkgw4K6uAc+hxWovdlkjNwlGTklYAhciYF6r4
aE1WecR7o0EsplVdgp7aTiquH1VEiUVYD46jPLDmIz6tJJEZ8SXMIZZkzAExer84OYFeXJiU8WcE
TJ2vlhCQ8ACXNip4ofTWa0dKSnyemhoRH9Q4+Ngz5yhsF+PnIVnYYgDYJckugSpk7nkcSpkSLQ8A
Yoe+CMP9/axzWrw7ojWuF6y+wgzZucukMcHv/YVaE+tj98PI3FP5YEnpE8tc2aRdZD6Qa1qmtEeM
tUhV7+yiq37u7FbFbnHVVPPFzM6N7zriptjZRt4ZWbFbcAZ0VOyyU7TrmMbJChNzUqaAOz4fZl7I
l/04KdmZZoiAOXwlkcAD1leqOuKCupqDK1DXD3E1qadN/Edl9XSgUmwQgRboJaHkjmdaZowyDnOp
vr5AqCIWvsNCqGRt0MzLEfof6nLMG4stO/0p/ECxfxDKYfQ7Q7DjAyByhpzm+VShIuRm1WxmZ0fX
m+R2Zr5sqnZl9zuzWLnm/dFiefvLqxc3/948My+NLtseybZHM77NMd9FU1drOzI7rodl+PWn2x/D
M0NvnOlKJ9Kj6WEtdn+d4oGxpwqCkuIqQSs6IUErntbFNIMJpQpueFAeJ2IUQlqYGCDYYMIa1Cge
Wn0Q2yhnLNa8SMFZNhJqjggBaakSawY2ZKkiPnlWSa9oQ5KeUxmcXGA4NP2Z59DsouQKS3Io8bkq
WC1a3GW5Gk2EJvFxLzve4ARPYhAaTvKTMbQhiDKkpAxOhjRuIGxt0yRw39y7xzoz7IV9nbFr2HU7
123BUSoM8um3qUSyy9i7Vqmiu4iNqYHygAOQoESAY1ecZYeABCLzPSKnkfJzKsKMVBF2SBUb9meE
tUYgtcIf42KHe2Dsq8IOVsz0Kl7R+p08jV8s5Kc7N02rsJjXd++UzC1Phss/7sEcLJTxjrfOEEJ6
hoCFuFMTbcUZJpGGmKSEllOAPuP2rZhBImZEht+bYhYJwqz4pMgWSOZIF/F3ACYPB+1UBQFErPh4
G51cEqA0hqKY5FIrQGv3/JJ53vNStXJW6AIvqiDmeucjwXuIkMzhH3ECspqFdCYJAFFQv8DKRsa6
Cysyi/rqzkITvk42gfDUFsA28HtHiyzlEfqmwH+ANqtF1a7XdWO3eP3l3YLLU9tex8g/LLEfwLOe
1ZVtAJfwrEMd3/QQiKCblBv8BQhYOXBTctpDAOBSPkjWsB4nax3HDKL1BNgiHBFgXaVwcChaDE+M
FjPdkp5R/Ob2gtHImnS8olnxux4WP9CSDSg+rN9F6WiLeCRLyDLyTimAh6iJGhE7/R9KtHNkRRtx
TS5r0FwkNJxeJzAKPyNiq14TC3BdppckZANwEzMV98kCFfwOY7IXTfaU6A28JINESTlQBBi2NmQE
7LCVMKVHEb838FE1T/SCI4w2mieQwEZ7vySVspCAOL06nKgic3up7pzgf4xuIxogcKh2tNoCza+3
R+IeBwMpkIjjaO3v3lvI98UJNplm+CH3p0TlZzgJQ2Dw/XB2yp8pLy8i/BQcRXk+HCN3siQua8je
ETqRwvdjdRMKkEZt/KhOFLKKXMnAxp0YHjMkOW/AWGhInpTfVPgul2c1rknr6eWQdJUlLEqs9qoL
KIf/sY1iIi6xqPimzRc031ecD6LvJX9H5lkT45kXjbBdkVTNwccsPoCFh5EUGTsUGF+hszdy57xH
xgo9/dKTHW6OFansdPJRjGFlpEDGafgKf2KmX2loFrHKKiHYRKHogABufGAorozJeQXhR8CLr+RM
Z9Z/2Wb5+nyJLG82djkLTE/KVH/qROnQGpWc1G7AECpsJE/N991houyQP7BUAw62r9sa88Jqe97Y
BuM3RLmJGfMp9DwhARx2MOGJX3iKH0PfSS2pvCOP4KNJwOaGXqY97Ov0en7e3H06cnhN3VcofBiV
cxv9ANKitH+PV+GKITtw1ZBHEy2dLMkjSebnEYVa0XxfPMCDYAUy2BBYEsCkfNFmyMs61Y2xXJYZ
3sc8QlED3SU94Yyfk5cgWGfhoIln8EbF6IlkQ4rSckDGFu/hULnxvaVrTB3GUO9ufmjVkyZBRRCg
HZDgtQxAWgnyuUpTgG1cvkjU02dY2Z5vzuunRweT2SJxPdzGARV4UuLwIE+Ak3sZwIp2Jy9gZ5BD
+x4+CJVbgBi05Hg/4E5aOmRQ1ESOzlbOdZyAApLGAy+omUb4uuec7FzwOR+gZScodbD4dwUpYeYH
oWIcRRalGGtANiJZfUvSz+PhAbHHPDBC6kuDF/XBdDvilBZcRjLfjvHue7c90dk2V6MHWNmphHdl
BAAhgXPf+6LKoJokXEej5wWPVAZ+7wNgFOU6Yr48OeCogji8wpcuoDFYhws/4CEW3QS0O+P4LYu+
0GOBH+oBGKokbun2lq5RjIL0ay2eMdLADUc5WItG4CZZBDFGUjFRANh4oogzt52zlE2F2fi7y1mY
+R4GBfCENEH9IUli6wdZdmFf8zt8Acnd0lsKf48vb1xyt+CDnVNZeva8PGqS4948MiiKGIn5WTv4
niGIcR8fyLbMmNMxJrCTZSJelSnCEuVjFqGPI4Fm4scQ0Sh+iurCX02EWDQYgSiNaLa9++RpSR8n
Ks9OWB+3yf6K3yo0y/MObL3o+aJxOBLzVJhuPZqF3h1kf9p/LXPsSzmNfQkqHqKNfyknnsF/kX0J
x8pKV2hsDesPs3T9jn8sYI71HX9HsjnRKmV9VaNWqTjdKj3RzgGnyF8sisqo7gte/VvxtACOuqYp
2CDRAOaSTFkYai6Br0o6cggW9S3Kt5qFBQSoL5xo42PSS9Np8ocDaIMAUZDp2BbZf+Dh1/AbiI+T
XIv5TcaTRrlw+pGH/hZqopnWW5jnoNz3nqWL1ceYPLzXHGuB/VpNAH0e+cEG+HlinVZUTI44oZ/x
9Uzxt9vsMrDueqnizq9/J3jEmppF4ReRxg7RDq/5t4tqHcpPgBv1YOVJkJ7G9xvy6w6BQi9lJy+q
+Cyh5RmHDN8PODoRLl8E01azc5tocTDRA+w9SaIXI0QR7T3aiC8ZIc3VaDIAN1HwwL/pkl8d5tmj
6aAP6EQStpEZ0Pyg0EL6MMCTpStvWxARp3v7ywjQeOyjKsu/YMMd1phMhfF4r5btcL2yYWOu0/iW
oF+Fci2jKfaDBh6HaOzBJo94+PqY75oie0csATrtEQZ9DZJxobBThOHJHfbSt+EMhqQsL2Ldu9c/
StpVpufxDkh8EEOChW2MRkbuvmCMXlVax+hQsvOOmi7ojA6ltp/MGOlQYpvvX9s+LC5dlTBtur+W
QN1fy5/urxnb/cUHsaVxZz58qx7GHHZMK6b2xei+VZA0C6WOsidwXh/H58LPlxzpgcunvr7cnah5
QoFn1hTVHL5O4Jme1Na0W6c7qMfUna3voHbvHsTNh+wiBL2nAWAFOZZqUsy/5MiQSKS6wEWTvDYY
1r0TqJFcf2WieDDaO0Q+zjrXTOLjSMjOajJFh9nuR8gZIJ7tVZo6xy2AWt7kHWNr5bN97uN34CI5
qPY2acU8ooZi4n3k6EvN62q1mK38lZ82vtT86tnt7c3uZVWZAfkLyIcOZqYX9Mb41rO2WrX2ywB6
lUgvS3/96Js7GSrarUCM/ezMla4kRHfyV2fOuoz9pOubbF+vqBDS73A6J5a+hyO4NYvU8tXm0sn9
oXb6rAAUdR0YEpWwJAgGDeDY9Z3pMxENKx1fjzptYb1jbUu6glBO299+9+BB/5r7zYub7c1Lg2c0
KGDvNahZ2oHJfJm94G6XRvcHtZSwBlg+gEdcnMaspmrIHXLidJvXw518uxKBfBhKDodf+ujLFC5J
JE8eB8GQyuXnPDCSxhEJrzDIRB3mZF9ZHM+a5SxmQpc1hy/bHH65qm3n6zBfV229Nhct2mo2nzeh
mQ1/QOtwxjD8AajZrJ9us5rVetEq0w7FxH7lqv8z/NEb7VaSH4wBEA/boy8DtUNB6hsQNK+rebue
H046ennLWMX+cFGMxKmRr+v5/GBup3jG76D/keKHH5S6/rn/utOX/wfWPRAMCmVuZHN0cmVhbQpl
bmRvYmoKNSAwIG9iago0Mjk5CmVuZG9iagoyIDAgb2JqCjw8IC9UeXBlIC9QYWdlIC9QYXJlbnQg
MyAwIFIgL1Jlc291cmNlcyA2IDAgUiAvQ29udGVudHMgNCAwIFIgL01lZGlhQm94IFswIDAgNTk1
LjI4IDg0MS44OV0KPj4KZW5kb2JqCjYgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERGIC9UZXh0IF0g
L0NvbG9yU3BhY2UgPDwgL0NzMiA5IDAgUiAvQ3MxIDcgMCBSID4+IC9Gb250IDw8Ci9UVDMgMTEg
MCBSIC9UVDQgMTIgMCBSIC9UVDUgMTMgMCBSIC9UVDIgMTAgMCBSIC9UVDEgOCAwIFIgL1RUNiAx
NCAwIFIgPj4KPj4KZW5kb2JqCjE1IDAgb2JqCjw8IC9MZW5ndGggMTYgMCBSIC9OIDEgL0FsdGVy
bmF0ZSAvRGV2aWNlR3JheSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGlVwdYk9ca
Pv9IwkrYU0bYyDKg7BmZAWQPQVRiEkgYIQaCgLgoxQrWLQ4cFS2KUrRaESgu1OKgblDruFBLBaUW
q7iwes8JoND2ufc+z83/HP73fGd86z3ffwBAXciVSLJxAECOOF8aEstOnpmcwqTdAwpAF6gCR6DK
5eVJ2NHREXAKEOeKBeg98feyC2BIcsMB7TVx7L/2KHxBHg/OOgVbET+PlwMA5g0ArY8nkeYDoGgB
5eYL8iUIh0KslRUfGwBxKgAKKqNroRiYhAjEAqmIxwyRcouYIdycHC7T2dGZGS3NTRdl/4PVaNH/
88vJliG70c8ENpW8rLhw+HaE9pfxuYEIu0N8mMcNihvFjwtEiZEQ+wOAm0nyp8dCHAbxPFlWAhti
e4jr06XBCRD7QnxbKAtFeBoAhE6xMD4JYmOIw8TzIqMg9oRYyMsLSIHYBuIaoYCD8gRjRlwU5XPi
IYb6iKfS3Fg03xYA0psvCAwakZPpWbnhyAYzKP8uryAOyeU2FwsDkJ1QF9mVyQ2LhtgK4heC7BA0
H+5DMZDkR6M9YZ8SKM6ORHr9Ia4S5Mn9hX1KV74wHuXMGQCqWb40Hq2FtlHj00XBHIiDIS4USkOR
HPpLPSHJlvMMxoT6TiqLRb5DH2nBAnECiiHixVKuNCgEYhgrWitIxLhAAHLBPPiXB8SgBzBBHhCB
AjnKAFyQAxsTWmAPWwicJYZNCmfkgSwoz4C49+M46qMVaI0EjuSCdDgzG64bkzIBH64fWYf2yIUN
9dC+ffJ9eaP6HKG+AOOvgQyOC8EAHBdCNAN0yyWF0L4c2A+AUhkcy4B4vBZnyCNnEC23dcQGNI60
9I9qyYUr+HJdI+uQlyO2BUCbxaAYjiHb5J6TuiSLnAqbFxlB+pAsuTYpnFEEHORyb7lsTOsnz5Fv
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
AcG7gh8v0l8kXNQWAkL8Q3aFPAk1DF0V+nMYLiw0rCbsebhVeH54dwQtYkVEQ8S7SI/I0shHi40W
SxZ3RslHxUXVR01Fe0WXRUuXWCxZs+RGjFqMIKY9Fh8bFXskdnKp99LdS4fj7OIK4+4uM1yWs+za
crXlqcvPrpBfwVlxKh4bHx3fEP+JE8Kp5Uyu9F+5d+UE15O7h/uS58Yr543xXfhl/JEEl4SyhNFE
l8RdiWNJrkkVSeMCT0G14HWyX/KB5KmUkJSjKTOp0anNaYS0+LTTQiVhirArXTM9J70vwzSjMEO6
ymnV7lUTokDRkUwoc1lmu5iO/kz1SIwkmyWDWQuzarLeZ0dln8pRzBHm9OSa5G7LHcnzyft+NWY1
d3Vnvnb+hvzBNe5rDq2F1q5c27lOd13BuuH1vuuPbSBtSNnwy0bLjWUb326K3tRRoFGwvmBos+/m
xkK5QlHhvS3OWw5sxWwVbO3dZrOtatuXIl7R9WLL4oriTyXckuvfWX1X+d3M9oTtvaX2pft34HYI
d9zd6brzWJliWV7Z0K7gXa3lzPKi8re7V+y+VmFbcWAPaY9kj7QyqLK9Sq9qR9Wn6qTqgRqPmua9
6nu37Z3ax9vXv99tf9MBjQPFBz4eFBy8f8j3UGutQW3FYdzhrMPP66Lqur9nf19/RO1I8ZHPR4VH
pcfCj3XVO9TXN6g3lDbCjZLGseNxx2/94PVDexOr6VAzo7n4BDghOfHix/gf754MPNl5in2q6Sf9
n/a20FqKWqHW3NaJtqQ2aXtMe9/pgNOdHc4dLT+b/3z0jPaZmrPKZ0vPkc4VnJs5n3d+8kLGhfGL
iReHOld0Prq05NKdrrCu3suBl69e8blyqdu9+/xVl6tnrjldO32dfb3thv2N1h67npZf7H5p6bXv
bb3pcLP9luOtjr4Ffef6Xfsv3va6feWO/50bA4sG+u4uvnv/Xtw96X3e/dEHqQ9eP8x6OP1o/WPs
46InCk8qnqo/rf3V+Ndmqb307KDXYM+ziGePhrhDL/+V+a9PwwXPqc8rRrRG6ketR8+M+YzderH0
xfDLjJfT44W/Kf6295XRq59+d/u9Z2LJxPBr0euZP0reqL45+tb2bedk6OTTd2nvpqeK3qu+P/aB
/aH7Y/THkensT/hPlZ+NP3d8CfzyeCZtZubf94Tz+wplbmRzdHJlYW0KZW5kb2JqCjE4IDAgb2Jq
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
L1Jlc291cmNlcyAyMiAwIFIgL0NvbnRlbnRzIDIwIDAgUiAvTWVkaWFCb3gKWzAgMCA1OTUuMjgg
ODQxLjg5XSA+PgplbmRvYmoKMjIgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERGIC9UZXh0IF0gL0Nv
bG9yU3BhY2UgPDwgL0NzMiA5IDAgUiAvQ3MxIDcgMCBSID4+IC9Gb250IDw8Ci9UVDMgMTEgMCBS
IC9UVDUgMTMgMCBSIC9UVDcgMjMgMCBSIC9UVDIgMTAgMCBSIC9UVDEgOCAwIFIgL1RUNiAxNCAw
IFIgPj4KPj4KZW5kb2JqCjI1IDAgb2JqCjw8IC9MZW5ndGggMjYgMCBSIC9GaWx0ZXIgL0ZsYXRl
RGVjb2RlID4+CnN0cmVhbQp4AaWcW4/bxhXH3/kppi8Bt7EZkRR1Sd0AbZEU7kPbwAL6kA2CrbJO
k+w6jiQn2RT9ki36ms/SQ878f0NySK3swg/SzuXcb3Nm5O/dp+57t7B/zbYpqo3bLMtis3WHW/c3
98p98Idj6fZHV3b/jntbt1lWxWrt7m3DSn/ctX9kTxdFXW23zap0d7Zw8Oc/3MsOU1MV5bbaVq5Z
2Zd16ZbbheFbVm5dl8W66RBnr4ymsqOqdM3arW18f+9+v3Mf7wyKiGqpXjgjarh4VYXFZQDRfWS7
e/fBbtcysnvpPnP5367coqhc/vVVS6l9OYWBf2jAhYG/3mhk/62NNctim+W/u9MgAFh2vNXc8UmA
IVgsFjZ3lXXY9+x+pc3a83cNAFYzP2rmEOBmcCH47EnAgvD44ZX73O3+hHRNgMdsQrLL7Vuood6E
xYtisViU2W7vBgpxXiFrr5D8dHv/+u7mZOTuvvGEDLUKuAjEbGmz2DRbtwjKrQOsZ48C8TS5AU3N
tlgutmbaAifS9nc3x+M7gdxWxbJsFktAikL3yRPT4SOcThFZlptiU25rIP7/RJaNeXy1jHxD5O7N
67vbj2YJrVYDDQ+laa4ZtCIKv7zd350eXs9qGHAXaPg6n5MeUKakN6vimzen794J4qYxddQWCcWt
hHd95W5ev757uM4/ee899/KJ64RpX082889ZmZZLk2lmkW6K/Dbcea8RFncekIVMiy6t+w2VU9ZF
tajKBnjS0f67V8fT7U+vD3PCKJeZj8RRSWvLB2aWFcAgbh6IN5xJ2tbboiorS0HiVbSd0xFkTXK7
aIzC9QSBL77++db91p1aO//iaH88MyO9efji9Myb/kcffvjDzd2b299YlJ521oWSzRTiOX1lXRob
xrezgGb19eb49auv3om25cpMYN2MhZLl7vnRRNIK44tTURSulZHxPx2sVtvFRTEAk3g3QJH/UUw5
3J7eHCyzTSrnPHGz2cO9/O7w483hy2effHSdv7y+us6/uj09e35s/woz3jquc/Pl6ysT0vWVl9CE
YlfrYR4cOmJqIf+ShLKu0GlTsXnCuMhZrdo4cWFFtGrKxGkj4rQiogCiWNkzpHKFqaPR2xUw9xZA
fSF1oObQXByh6PjSr85yRihzqKwSOKylmAlgXJ4QxhIRAX0qjWAKPAe/NstjNdar5QToAUhvxLKm
7pHLV+IPLEKrtRRvKVfjpf7vLAexYEBAJNOmYjE3iDFmBwNnHZZkdVValGxrlVGOeT5X+0R4MRnU
9dISYmWZJSm4RXMk9YcoeGSA8rX8FApkJHvPrmPR59WOBXPeUq9Dwrng/GCZIkip3JgsFi58+MRb
hfNDlv8l2P3JFNw5AGRZ8vSOIBZMS90KE6SfYKmNfJ6NKu8pdyc7XMBAs9le5O4wEKjDUKHO3MEf
Tl6OWURdslQMMbo6kUHWC4JktwTFRISiKUz/ZaBJmKE2cfgI5HsJHjLDriw/JnB6IcWr7QxVTN1d
tcdfO0UeIVSU7xnp2TtUJ9j+LkgPAiAKkR+btQIyiKEBZ5ZHnOOjKFDMizrSQ8hyuQaGO7L8zxLj
Ul8qfan1pdGX/165cl0sTSKi8t86SFt8bQ/SM2GqWetcEcPKVLp6EZSZ5XAdQ4tkpk+iB1YCt/8R
u2btRvHa5buxR7AbXiKmfYIC2YNLEsASmCHcoe1oLvfw9bVsgn0oD4pExqNW0pMX9EQrEamvpccD
ixhixKQQzD4xYwj8iW1YKVwcEWwAmeVxbmh9E40akQpu6ArIzbu1BrCskby0AlJYqhUmgTGXxJE9
fApOymWrWmw9G6TkZlUr2fSbVSEDx9IsoTpoOcvBH2oXl8diLSUFo2cbElKeBZUYkhjmDQsj7iEM
EgMhEmMNU9BS9OTUdvl8Os/GxW/T6NBxSTZU7rcYd64P1YTe0eub0+l29kjRnIU2c6aygFoUn8UT
VfO5/T17pDIUSfouN1ZV1XaKV20WLeODEKv0Ka0FoWb5Of/Dc3pW4HPBhBX4UmDeCn45kEtFxC9p
XIEujAb1x8IucUHogy6VJBa08a1hIzjqKuaRem1WsNm2hZ2v55ahnnN5CFO9A4kMX58Q2prHo0g/
3p09wTWVPP8SIy4XwSbOtxkuNOKz0M4acfV+asbTnZGmlJNG6ZfbTbGoq9hzGJtxls+YsXtrM/bW
irnIItHhW5hfL43IFPCCWGMCWai0tkeDJyrWDtE9BhZF6EvO/UvrNHbnft9pOH8TstzIxB6xmqy7
E8lD6LPgNNNQOQ9wtSoW5WKdNrs/Wz5NrWa6ZRMxTFlNcqSUtehTokcX88Evy98q+PmoiNpB4DFm
+VsFP5fPW1+vApIBEfzSEkUMRzOMJnU4U51hkwekAEt2fI3BDVNMsvByLQe/IIAt7RbP96vOZ2H1
en1fc8ZGzsKqa0vzbehXhKf12PU1K/drd51Hc6ytG/++K38TLN5C9qA+i3RHe6zskLCpm9goiVFM
6vD2mEaztBTuDkLd6QuVxMzmja70lXiWPwmpXlg4c40nmr4Gh/ws25Dw+P3CKJGcCQnL+kxmiiFh
1FP67PmxK4LmAg1Qo9jjzVdSHUsgCgP69OO9Gnk+HLjLwoEP4HLMuXDgcs7FVDL4WVSWB7bUQSuB
KraomFNgWrLSCWUWCO49H3qcDl/xFlnwp4wzBokJE2tb01F39dIunJreTW1SdrnYBxYL+oTyUdll
Watrz7UvBJadXY+QrtdFY42zJBBEowvRbeKue1m9xV23XRvrFNdvGYZ0pZahy188SNemyc7pT+j2
p77PEnWTAqDe6gLugqhbb9TwjaoYdFIy/xRiN+53IHLp//iA7UktkXK/KMsVuDAWjqTaM+8wg/w5
9DL65MAVVYTT+R6F1W4wgwtqvwhmBTyJYE6tlmDV4NNu5iIGMrX2zzHci0n4I19I8/AX+yTJgxKb
CoShobQnAUTRJR6YCJT3qg+kjfyRDoJk5AHO94GN3mVFlA8s0u0SQRCCLkCiJrSWQpgxMROD6pUu
3caGnw3eAP0AA3pA04tDEABte4nNk9JT4j2qgkVAi244Q1YAfiUdCkG8TEvO1GACHgIJU9lEefnf
pBsbr6owHDhuL1a6+CTZ/x6FRavvUR+uNejoiA2xHtygJzCtgAnkxhfgw/HADXyQEByMFICa+ZYR
vgDQr4npDncFN7KBN7QHODR9NCkNYxeqETVHcDMlIWkJ4LAK9GJL5iy+0RO5scWHV28h1MfuMpz1
pCpSYI1FmjHDuOTCqrYHfRffT9ujwaTjNUhT4cXe7tE0hQPMJwS7j4C7vlw7c38x1nuWo3cMHwNF
UeS5j+cLTEtEAEf1iFe6/wC/8/73AlrBSiKavXigjmtvxT0cUGO9gZ1ewIed/r3D2LORAjwwYqC9
8UdG4S9NSTIoXA5OPc12RwTkQzzeAlH7xSHygQ2W2gMZfzcHQNag3RH23nEARsOSXjcIDKzpUTXn
qOXk7VbS2oBEGOML2Ah6EoJHn+VzQnXxugBofMFGCFGmyHHRIwahQai5q0okqSqLWxQw8gVocASU
xEcDoiwnJSEq9CGigAtLwGUtPDKCUQjMMb0/Bmc0Tb+6d7t2YNE+JiEJsBh5+p91NIBmudNlfoAs
EUssbricRsWJVBFQjJyIIfJxL5rQExDBzxdJb9IyWu+YeC1VL9SynEljIRUAU+RmeRQxijQZRy+c
P1NVPGJrz1SZLezevLcpKH15Va3VyTpP4a7T7zlXjHloIilPKCi4ojjmxsLFZ0ERZLJfXkgUwzhl
kUTHaNJPRkaqpeP4Yq8Gw8qYsFKfSX0vTQt/DDkkXctINEeRgxHiO8EEIl1HSGYN/GKxidCQER6U
Pu/A2gAssiSTaKyp8Nt3EF3pASrg4chw/hOMciq4IHqlkPt8Rgf5vt9QqXhgeN7M+0Em1AqByF6D
XTxeHGRGIqGykBHDEpUXIxQ4z0e2qyd9vYpHdElhCBqL4MtUKJloG1U8sbugPVNN/KbBQk5SCuwC
J5gwdI4ZYAU6iP19rZUMAYLoJAYcox8IhsctveSx1wb6SYy7/CcxQ1jgJ+Ewgr3jFOIimHCvywA/
WACbLvLMEF7BjWcCeNL9gtGDKzARI8+FRg/VEBBGshx9TBTWyEyCYbsGwH+jYk561icMtg1WXi72
AoPdkbepsPstVmVvO/0NwvnAMJHThA8SsVLwpgp/FwbjpQp1ytgz+s9kJCmQm+TnHhV49ttGc3eR
VQ2fc5e1/ZitWdivQeLzgvbgnb/6zpiffKQeAUZ5lnYHXy6r8XOPzH61JlrR2fyJs3eGYTVuIzh9
nn3Uffty07szWiVmInymYpuQIVTvKeq1iA6x0rErSfvVnb3MKy6s6Mq2/dBec10Qhu33iFPd+6BB
371vRf88hOF7OYl5Vpe6jeHuEymzghHjslti/f4QZ6wo6EZMAQMg+vtkdwXRBeeL13Kt50KXsPpY
Vr/4QoCoEpXEUAi3dlBGy9iE7O5t6zFvY1RSCFbwsOOJTiyL9cCoVwIkMQkUkMx24cKuKb4EhShD
xiF2a4mAQHBwgNiEjBKlTgPKfrzNxQaVINM2hHAI1hJm8D6RB3w/kMWfx7KHTKU9MCvwmkAcYW9M
iggXC4ESAj5Ms4YpemBF8B7DPPN0F7JtSfSnwY2l/QDyov5jD/0464PFDifBwSUEptCmxMQMvGtP
0EK0CdTCHrSAdGK1JgRMcXxB7hNLAk8RDNuh/OHpt1gXWse6YEPAWYJTfaPYGfiwLp94hiENYD3Q
oRnBV0nfNjyD1JnCes41DxEHZy3jPkA6AoFVY/wqpaPHWoNkkAt6/qPNsIUqOcQwBcc/oHg4xAqF
isU2MGfhF540COHAFNX6jESj7aC4LL9nF3PIkCmEyRdkD2yraYIS2AZEbJHVjEggmF3YZEbG4icx
YCj9+oq3GCpu/kcQaEQiEVomsGSwMqU9QdP9akdgYFkD2vOAdoCrJbRWMaUEynUeK/KYIyEMbWD/
T4WXNUqfLrdHU0FcE+d/dA6osdBREOSCAz0LgXy8f5GvOeDIETUh0nGovsTi/dUwC3QHm+ETkvbU
498Jl7wTjj02E2gwU6hObBE9zC/xxPY6hQgjPbxjAjHkMIQ0jMJAV0KOBIU8oE8iQ3vKA+m7M+jT
HomdCTwA8H5JplfWvWv2eFhj8fEpkERwgkI/V9AEWShC0RQRE65RRhjJ8rSpyOJEiGQzIhc4D+ld
U/QasI7lBoYxzt7ZnzyJaNA3cIt+AhgeGfq9vbI7HbWWfsGRYcvTptAE6D6SHlX871CIJBJ/fMsA
n/Dwi7l3sFUJhbmUv9SsZKQ6GMeKKXX9uFZGBYY4JaIp7RGuZuCP3QpRvWe9MPEzFgbzAhSNBrUz
lHIKHV9KYIIDYAjSDHuYkZC1ImVTK6ApegYmqN34XGB3QvpaKrCpWrQi6sCa28MOIeRLcdrzOFQq
X0SLUAgLhDzWMIUUfArrDjAzNdZm8l43SR/KwlYuEbmxFmwLvHQ+PAGy895FroS1L+ZKGziW2OCT
mRDJegdjKEDJ2s0AYKxVsa6H7Rl7SN0+pbbfKxRNU29dvS2acmvPspaN/QSkrly1GP8fU22yHd+3
LRZ+u+2q1ttlo3Na+6rTGpL+Y5yhY3M61aMxEfQ3fOo9RqSOEIjsf6eqm63V0aoIVr4iyH81+d9v
2PJtWdctux3hCbyktMjtOffuG38n+un/ACEdEPgKZW5kc3RyZWFtCmVuZG9iagoyNiAwIG9iago0
Mjg3CmVuZG9iagoyNCAwIG9iago8PCAvVHlwZSAvUGFnZSAvUGFyZW50IDMgMCBSIC9SZXNvdXJj
ZXMgMjcgMCBSIC9Db250ZW50cyAyNSAwIFIgL01lZGlhQm94ClswIDAgNTk1LjI4IDg0MS44OV0g
Pj4KZW5kb2JqCjI3IDAgb2JqCjw8IC9Qcm9jU2V0IFsgL1BERiAvVGV4dCBdIC9Db2xvclNwYWNl
IDw8IC9DczIgOSAwIFIgL0NzMSA3IDAgUiA+PiAvRm9udCA8PAovVFQzIDExIDAgUiAvVFQ1IDEz
IDAgUiAvVFQ3IDIzIDAgUiAvVFQ0IDEyIDAgUiAvVFQyIDEwIDAgUiAvVFQxIDggMCBSIC9UVDYK
MTQgMCBSID4+ID4+CmVuZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlcyAvTWVkaWFCb3ggWzAg
MCA1OTUuMjggODQxLjg5XSAvQ291bnQgMyAvS2lkcyBbIDIgMCBSIDE5IDAgUgoyNCAwIFIgXSA+
PgplbmRvYmoKMjggMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL1BhZ2VzIDMgMCBSID4+CmVuZG9i
agoyMyAwIG9iago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9Q
VVRHTlkrQ291cmllck5ld1BTLUJvbGRNVCAvRm9udERlc2NyaXB0b3IKMjkgMCBSIC9FbmNvZGlu
ZyAvTWFjUm9tYW5FbmNvZGluZyAvRmlyc3RDaGFyIDk3IC9MYXN0Q2hhciAxMjEgL1dpZHRocyBb
IDYwMAowIDYwMCA2MDAgNjAwIDAgNjAwIDAgNjAwIDAgMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDAg
NjAwIDYwMCA2MDAgNjAwIDAgMCA2MDAKNjAwIF0gPj4KZW5kb2JqCjI5IDAgb2JqCjw8IC9UeXBl
IC9Gb250RGVzY3JpcHRvciAvRm9udE5hbWUgL1BVVEdOWStDb3VyaWVyTmV3UFMtQm9sZE1UIC9G
bGFncyAzMyAvRm9udEJCb3gKWy0xOTIgLTcxMCA3MDIgMTIyMl0gL0l0YWxpY0FuZ2xlIDAgL0Fz
Y2VudCA4MzMgL0Rlc2NlbnQgLTMwMCAvQ2FwSGVpZ2h0IDU5MgovU3RlbVYgMCAvWEhlaWdodCA0
NDMgL0F2Z1dpZHRoIDYwMCAvTWF4V2lkdGggNjAwIC9Gb250RmlsZTIgMzAgMCBSID4+CmVuZG9i
agozMCAwIG9iago8PCAvTGVuZ3RoIDMxIDAgUiAvTGVuZ3RoMSAxOTE1NiAvRmlsdGVyIC9GbGF0
ZURlY29kZSA+PgpzdHJlYW0KeAGtfHlgW8W198y9V7ssXcmybFmRdGVZcmxZlrzIiZdE11tMbBI7
G7EDxg6Js0DATghhT0zZE2gCFCi0fQkta2lBcSh1WB7po6UUSOGVLemC0lfK8mialJfQQmLp+81I
zlL6LX98Vz6zz/nNds6cmXuTjRuuGCZmMkZEoq64dPko4U9Igde1YtNG5uNxriNEb1k1uvrSbNx7
HSG6/tXrrl6VjYe+RUjgtTXDy1dm4+Qk/Po1SMjGaR380jWXbrwqGw8egH/OupEVufwQ+JPQpcuv
yuGT3yOuXLb80uFs+a7H4VeOjly+MRcfgn/O6IbhXHnaR0iBnTy1yEKzBbIui9jJ56SZ3EQ0RCAy
iZJ+9GSd5m0iIc7yNYQIP/5oyaC1+bjeoOf1frBkpIUFfmHauyJ95VcLNN8z/AJlDbw8y0A97ROT
DxAi7U9fmYlpvncqh+Wyx757qa9llkRJFBQDiTyUQKgHNAgaAr0JSoGOgPREgcvKbgftBLEcDfGJ
GRIFxUAiScAdBKVOxbYjtBO0C3QUpCGqmN5jstT4WjrFNKqmyShoJ0hC1dOxIzxley5vF3yRWCUN
+hKFmwBtBx0BSUQRTyJdFk+QEdAuxA6BJHD/Ck1idIL0wB/idAL+SfIS0t4CHQUZM/vEf+xZsKiG
tDSLX4LRl2jll6QXNAoaAyVBh0AYB7hRcRI9/hKMJ3mpIYR3gF5CfB/8t0CstAl8WIlJQE6Sp0GM
z1QpVuIoyAD4L8eb7qvZywN5Nh44vqexueatFod4HH3bwV0r3CgoAeoBbQc9DdIC5ti4wczrHRtv
aKxpYV06hqVVmxmDvwg+4nsWLMS4e5GQAPWAWOZbIA34HkMjjwHpGLpwDKNnhbsdtBN0hKWAxefj
9Y0c5fPx+YtrWuazJPIO5/45eTvnP5vzv5/zb8n5N+f8y3L+mpx/Xs7PtvJzMjsXn5XzWS8YTk3O
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
i1hwDsENq2qWxalbWK9nChL7QMTrwSUP1elCciQyIfxexaWbw+v1WKy4O/296iHUQawyOpUtR/Qh
mBJ6tCYUtGA3fQL/BvXbquyR8aXpJXj7cOsuK7WmLWwzMI16qOzZ4jnkEaEy7n92C8WHLRTfn38H
31cn6PvYhWG0rcf7uUnXsYGiwwMfyuz1HSSInRsgW7fqq8Ia2G1MhrLmW2FD7h/j6WR9sx6fm7Ar
Cn6X54HaLfSxt3jv5Hx+l+eB1fVT3OXJJdYGC8K7rTnTrx8CG14/sIFXZuNjQW3Shc3UOsYcrgWs
3gT5EGcVK3eQxAw4ZH3wLFhaVdNpMzL7NQCXUcgq2RCETcZfVGQPMPn5ufcWPKqjuVumqXMNPZb+
Xk1dout57PXtnx9txY7/s7mJ+ni6Yl5RDAfdFmYDvKHDDdHM6VWQuEhDupy+z3wufScvsvoaEMYh
l7A3QPxJB/DtMZPLf37sSGjHN+Wd+Ga7C18h9+Af3C7Al+uL8IXweWQpvm8+H98ls4fiW+VsfS22
bdK7ZHHn/P5w28gVG9YOb5g/fGXvokjryLqV8xb/LzIec9QKZW5kc3RyZWFtCmVuZG9iagozMSAw
IG9iagoxMzAxMwplbmRvYmoKMTAgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVU
eXBlIC9CYXNlRm9udCAvTEhTQ0pSK0hlbHZldGljYS1Cb2xkIC9Gb250RGVzY3JpcHRvcgozMiAw
IFIgL0VuY29kaW5nIC9NYWNSb21hbkVuY29kaW5nIC9GaXJzdENoYXIgMzIgL0xhc3RDaGFyIDEy
MSAvV2lkdGhzIFsgMjc4CjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAyNzggMCAwIDAgMCAw
IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDcyMiAwIDAKMCA2NjcgMCA3NzggMCAyNzggMCAwIDAg
MCAwIDc3OCA2NjcgMCAwIDY2NyAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDU1Ngo2MTEgNTU2
IDYxMSA1NTYgMCA2MTEgNjExIDI3OCAwIDU1NiAyNzggODg5IDYxMSA2MTEgNjExIDYxMSAzODkg
NTU2IDMzMyA2MTEKNTU2IDAgNTU2IDU1NiBdID4+CmVuZG9iagozMiAwIG9iago8PCAvVHlwZSAv
Rm9udERlc2NyaXB0b3IgL0ZvbnROYW1lIC9MSFNDSlIrSGVsdmV0aWNhLUJvbGQgL0ZsYWdzIDMy
IC9Gb250QkJveApbLTEwMTggLTQ4MSAxNDM2IDExNTldIC9JdGFsaWNBbmdsZSAwIC9Bc2NlbnQg
NzcwIC9EZXNjZW50IC0yMzAgL0NhcEhlaWdodAo3MjAgL1N0ZW1WIDE0OSAvWEhlaWdodCA1MzIg
L1N0ZW1IIDEyNCAvQXZnV2lkdGggNjIxIC9NYXhXaWR0aCAxNTAwIC9Gb250RmlsZTIKMzMgMCBS
ID4+CmVuZG9iagozMyAwIG9iago8PCAvTGVuZ3RoIDM0IDAgUiAvTGVuZ3RoMSAxMjYxNiAvRmls
dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHFewl0VEX2d9Vbu193J71vWbo73Uln37eGkHRC
NkgCIQsmmEgCBAMCAiLrgAhoIOA6QgCZcVQcEXWmCQ408MePj4nKiPyPCn4gougIiGIGx4kgQr/+
33odIuTM8eOczzPfe6mu9VXd+tWtW/fe97Jg/oMdSIVWIhrVTmqfOx1JV2ofQtSaqbPb54by+vcg
fm/qwgX2UJ5NRoheO33uvbNDedkbCCl67p21ZPB5wxmEzC2dHe3TQvXoBsS5nVAQyuNsiF2dsxcs
DuX11RCvnHX/1MF6w2bIl8xuXzw4PoL+kH1O++yOUPvUbRDHz73/gQWD+XyIp82d3zHYHjcBfccR
hlI7WorkaBaSIQqp4QYK+YuKHsRALamHcGX84mcmhxf8gDQyqbsX3KkrSeKDhmNPXz1zw61YIS+H
dnKpPamAZ7gEMQEhJYb6TxQrhmpILbnsftSS5Ed1ECohFELIhpCYtEvm3Y+fRPrWAa8c2xiksJ2y
/ONNnAprcEH69eFUr1KF5FNXF9imrl5dmVAsx1Uoj8HIhsuQS4pLe12v2vy4sNflhGhUKKJ686Ig
h7zyPJctkDfFdiPPL8PeCNuPrt/arkK44iqy/eDKsH0A7d7Pq7AdK4b6XtvRRD8F0bsuP4O94bYj
rodtf8lLsL2RN9LW64ayXtuuYoj22LbnPWx7cY1U8kKiFD3v8uOtvbY/kGiP7Tnof9NqqWJj6MFV
oWjuGmmg+3dL0ZzdfurVPbbZrjjbFHgQexW2VtcsW4vLY2so9uPYXlsNeWyPrdp9zFZFhu61eUMD
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
qkP1qAG+7ZuI7oIv8prR3fA9ILkw9IClFAfvSlB1Zf3osXVJlR2zFnYsmDG1PaXk/lnTSKub11pI
PAOBWP9vQOiDQNwy5yAMQEMGgh6CC0I2hFIIDRCmQVgAYQ2EZyBsh/AGhD4IJyCcgzAAk2Yg6CG4
IGRDKIXQAGEahAXBwQvGQkNpDCf97fm0YfniYfmyYfmKYXlJlbil//HD6muH5euH5duH5acMy08d
loe53TYfab1vGf/eYfWdw/IzhuXvG5afNSwv/U/BLf3PGVZ//7D83GH5ecPy84flHxiWXzAs/+Cw
/MJh+cXD8ktI/n8AnS9FSwplbmRzdHJlYW0KZW5kb2JqCjM0IDAgb2JqCjgxNDAKZW5kb2JqCjgg
MCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9CYXNlRm9udCAvUEpIV1FM
K0hlbHZldGljYSAvRm9udERlc2NyaXB0b3IKMzUgMCBSIC9FbmNvZGluZyAvTWFjUm9tYW5FbmNv
ZGluZyAvRmlyc3RDaGFyIDMyIC9MYXN0Q2hhciAyMjIgL1dpZHRocyBbIDI3OAowIDM1NSAwIDAg
MCAwIDAgMzMzIDMzMyAwIDU4NCAyNzggMzMzIDI3OCAyNzggNTU2IDU1NiA1NTYgNTU2IDU1NiA1
NTYgNTU2CjAgMCAwIDI3OCAwIDU4NCAwIDU4NCA1NTYgMTAxNSA2NjcgNjY3IDcyMiA3MjIgNjY3
IDYxMSA3NzggMCAyNzggMCAwIDU1NiA4MzMKNzIyIDc3OCA2NjcgMCA3MjIgNjY3IDYxMSAwIDAg
OTQ0IDAgMCAwIDAgMCAwIDAgMCAwIDU1NiA1NTYgNTAwIDU1NiA1NTYgMjc4CjU1NiA1NTYgMjIy
IDIyMiA1MDAgMjIyIDgzMyA1NTYgNTU2IDU1NiA1NTYgMzMzIDUwMCAyNzggNTU2IDUwMCA3MjIg
NTAwIDUwMAo1MDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMzUwIDAgMCAwIDAgMCAwIDAg
MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAx
MDAwIDAgMCAwIDAgMCAwIDAgMCAzMzMgMzMzIDAgMjIyIDAgMCAwIDAgMCAwIDAgMCA1MDAgXSA+
PgplbmRvYmoKMzUgMCBvYmoKPDwgL1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9Gb250TmFtZSAvUEpI
V1FMK0hlbHZldGljYSAvRmxhZ3MgMzIgL0ZvbnRCQm94IFstOTUxIC00ODEgMTQ0NSAxMTIyXQov
SXRhbGljQW5nbGUgMCAvQXNjZW50IDc3MCAvRGVzY2VudCAtMjMwIC9DYXBIZWlnaHQgNzE3IC9T
dGVtViA5OCAvWEhlaWdodAo1MjMgL1N0ZW1IIDg1IC9BdmdXaWR0aCA0NDEgL01heFdpZHRoIDE1
MDAgL0ZvbnRGaWxlMiAzNiAwIFIgPj4KZW5kb2JqCjM2IDAgb2JqCjw8IC9MZW5ndGggMzcgMCBS
IC9MZW5ndGgxIDIxNDE2IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ab1ceXhURbav
unvf3vd9S6e7s5B9J4FcQjaWIItAggYDhFWRPSwDTFQggogosgi4K6uaECIEGRxGQUCdERwERXR0
RMdZMjrzkHGAvnmnbgeEzHvvmz/me9196lbdterUqbP8qm7Pn7tgMtKiZkSj4eMmzJ6ClM8wB0Ls
+kkzJ8yOl82nEcKbJjXND8TLbBJC9H1TZk+dGS8LTyIkeqfet7jneuuPCBUMnTZ5QmP8OLoO2/xp
sCNexrmwTZw2c/6ieNnUAff33DdrUs9x6zTYv37mhEU9z0cXoRy4f8LMyfHzay7DNnH2rHnze8rl
sG2bPXdyz/m4Fur3AcKwtwo9gVToXsQjChngW48Q/63oRQwcJcfhM6j/Rd89+pIfkFFQyvfUPKZs
z9z56/U/Tr4eVT8u/BN2qG6cT7ZcspyMkAbD8S714zePKNdBUtWJRqV2okFApUB5QKmpAxyoGe9A
64GeA6LRdPwIWgy0GugpIOZmbjeUDuFH2hlBegMvRi48WFIz/jstTr9DVPs/7MRcxzP+TxxfHcZO
6L0vsbNdi1QDRPwcfhY1Ij9+GYXxElSNkvDW/cn3+Rvg0G40G6gZiFZSjHe3+7L9b+I+KMxguCaC
fAw+4P9DVpr/66xOCrf734p2MrD5lQ9Kkt5/1PuM/5feqf43gfbGD+1JhjMO+Hd77/Nv8HXire3+
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
ZqD1QM8BtQEdBToN9AXQ94AzISADUAAoE0gCGg7UADQbqBloPdBzQG1AR4FOA30B9D34KAjIABQA
ygSSgIYDNQDNBmru7vnAiehmHqNAr3JCr3JSrzL8j9xt16f2KvfpVSaI6K3PS+9VBkfgtuNQ99vK
Wb3K2b3KOb3KYMduuz6vVzm/V7lvr3JJr3L/XuXSXmWpV3lAr3JZr/LAXuXyXuWKXuXKXuWqXmUA
i25r79Be5Zpe5WG9ynf0KoPM3Ha/kb3Ko3qV7+xVHturPKFXeWKv8qRe5cZe5cm9ylN6laf2Kk/r
VZ7eqzyjV/neXuX7epVn9ioTRPZWeZ7Vqwxj7bbjc3qV5/Yqz+tVnt+rvKBXualXeWGv8qJe5cW9
yktuLwd6jfdApNdxsHe3tifg7VV23l6+hkn5vwHOU+BmCmVuZHN0cmVhbQplbmRvYmoKMzcgMCBv
YmoKMTQ1MjEKZW5kb2JqCjE0IDAgb2JqCjw8IC9UeXBlIC9Gb250IC9TdWJ0eXBlIC9UcnVlVHlw
ZSAvQmFzZUZvbnQgL0NGUEhPUitIZWx2ZXRpY2EgL0ZvbnREZXNjcmlwdG9yCjM4IDAgUiAvVG9V
bmljb2RlIDM5IDAgUiAvRmlyc3RDaGFyIDMzIC9MYXN0Q2hhciAzMyAvV2lkdGhzIFsgMCBdID4+
CmVuZG9iagozOSAwIG9iago8PCAvTGVuZ3RoIDQwIDAgUiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+
PgpzdHJlYW0KeAFdkMFuwyAMhu88hY/doSLpGSFNnSrlsHZa1gcg4ERICyCHHPL2MyztpCH5wP/7
Mz+W5+6tCz6D/KBoe8ww+uAIl7iSRRhw8kG0J3De5v1WNTubJCTD/bZknLswRlBKAMhPRpZMGxxe
XRzwpWg3ckg+THC4n/uq9GtK3zhjyNAIrcHhyOPeTbqaGUFW9Ng59n3ejkz9dXxtCYETMdH+RrLR
4ZKMRTJhQqGaRqvLRQsM7p+1A8O4d55arUo1fGr/wylo+eIzkl2JOE3dQw1aAviAz1WlmMqDtX4A
bZpwEAplbmRzdHJlYW0KZW5kb2JqCjQwIDAgb2JqCjIyMwplbmRvYmoKMzggMCBvYmoKPDwgL1R5
cGUgL0ZvbnREZXNjcmlwdG9yIC9Gb250TmFtZSAvQ0ZQSE9SK0hlbHZldGljYSAvRmxhZ3MgNCAv
Rm9udEJCb3ggWy05NTEgLTQ4MSAxNDQ1IDExMjJdCi9JdGFsaWNBbmdsZSAwIC9Bc2NlbnQgNzcw
IC9EZXNjZW50IC0yMzAgL0NhcEhlaWdodCA3MTcgL1N0ZW1WIDk4IC9YSGVpZ2h0CjUyMyAvU3Rl
bUggODUgL0F2Z1dpZHRoIDQ0MSAvTWF4V2lkdGggMTUwMCAvRm9udEZpbGUyIDQxIDAgUiA+Pgpl
bmRvYmoKNDEgMCBvYmoKPDwgL0xlbmd0aCA0MiAwIFIgL0xlbmd0aDEgNTA2MCAvRmlsdGVyIC9G
bGF0ZURlY29kZSA+PgpzdHJlYW0KeAG9WHtwVNUd/p372N08qEkA2TyWe7eXzTtCUCkQCkuyGxIS
IBCguwiym2RjEhPJYEgFB7pDwcqCVEWogqPShxUoctkw9AYqjYyOOq0KOlq1zCj11enI2BcdFc3t
d+4mK2GUyR+M98y5v+c55zvfOXvuvduzdl2ExlCURGpYEe5uJesa+zBEaXNXuDthZ/0BMqe5t0dN
2HIhkdjZ2n1bV8J2PESU6rqtc/1Q+6z34O9si4RbEnH6EnJaGxwJm90EOamtq+euhJ11DNLRuaZ5
KJ71FmxbV/iuofHpHGz1jnBXJJE/tgdyUveaO7nENbYet8LutZGhfBYAvleJwSvQg5RCt5MdWgbK
KiL731NdJCHK47hqZ5+buPq6WRcp02HZqxf83JJnl758/2eRLwvSHnB8DkfKcD6XtqLBIqJ0hviF
tAeSEasdboJBjSUG1aLOQb0ZtaRkrpOi7Em6H/UJVJHa2XZaj7oN9RFUKakdgNXPtsclh/cEW085
bL43TVKWjstWnKlpymsGsx17THnb+f5Jlo3VO8+y42MoZW4qe4I9Ti2ksN+Qh22gGipke/uKOpUQ
QgeoGzWKKlp3xg7EJ05VTrFS8kgMbfJposSOKx+XlykflhsCiyunCwwJ4tmJsLzXKQOux5Q/um5T
TqEeSoQOFiHjuHLA1ansmmiwvXHlQZfB0OaBhFjnQtPjSlfRHqWl3IrX7zGEQ3FlBuLLvWnKtOlu
5WbXB8rkAsPBYJe56pXi8peVSWiINBWderyZSp5rlzIToYkuf8FM1JPsINtHxWxf3DNfOQEV0+2r
LZq+x2B399UUlnsMtsE7raZwT1FNgaeoXvEUVRcUQF/+on2L/Rb7XPtUe4m90J5vd9tz7eMcWY4M
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
khEMN16d4aVJ3AC5DGiXWgwvv0YM/2g0DAdGxXAwiXQEwyuAOcgZviXJsDdXp8vP4egVxy5d84N5
5WWU401JzsJ7deIa/g8nHV8W6XC58UGNT2rrmkbTIAWeK53Bt5uI/4CqEv/LOCYbJKE6MgyiM6jc
hi6egw5phxQhU87RCbQiWl5yAj3JkFPKb8x0ZxagVko7jS//Jj/zRZUhLbiE73xkWJcZwXfLN108
nkDH8AWW0Gz4T4qqqhtqFi0pqYl09kZ62pvDyTzeC+KUZw5d3JHUh2b6f4t1YkAKZW5kc3RyZWFt
CmVuZG9iago0MiAwIG9iagoyNzA1CmVuZG9iagoxMSAwIG9iago8PCAvVHlwZSAvRm9udCAvU3Vi
dHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9DRVFTWUQrQ291cmllck5ld1BTTVQgL0ZvbnREZXNj
cmlwdG9yCjQzIDAgUiAvRW5jb2RpbmcgL01hY1JvbWFuRW5jb2RpbmcgL0ZpcnN0Q2hhciAzMiAv
TGFzdENoYXIgMTI1IC9XaWR0aHMgWyA2MDAKMCAwIDAgMCAwIDYwMCAwIDYwMCA2MDAgNjAwIDYw
MCA2MDAgNjAwIDYwMCAwIDAgNjAwIDYwMCA2MDAgNjAwIDYwMCAwIDAgMAowIDYwMCA2MDAgNjAw
IDYwMCA2MDAgMCAwIDAgMCAwIDYwMCAwIDYwMCAwIDAgNjAwIDAgMCAwIDAgNjAwIDAgMCAwIDAg
NjAwCjYwMCAwIDAgMCAwIDAgMCA2MDAgMCA2MDAgMCA2MDAgMCA2MDAgMCA2MDAgNjAwIDYwMCA2
MDAgNjAwIDAgNjAwIDAgNjAwIDYwMAo2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYw
MCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCAwIDYwMCBdID4+CmVuZG9iago0MyAwIG9iago8PCAv
VHlwZSAvRm9udERlc2NyaXB0b3IgL0ZvbnROYW1lIC9DRVFTWUQrQ291cmllck5ld1BTTVQgL0Zs
YWdzIDMzIC9Gb250QkJveApbLTEyMiAtNjgwIDYyMiAxMDIxXSAvSXRhbGljQW5nbGUgMCAvQXNj
ZW50IDgzMyAvRGVzY2VudCAtMzAwIC9DYXBIZWlnaHQgNTcxCi9TdGVtViAwIC9YSGVpZ2h0IDQy
MyAvQXZnV2lkdGggNjAwIC9NYXhXaWR0aCA2MDAgL0ZvbnRGaWxlMiA0NCAwIFIgPj4KZW5kb2Jq
CjQ0IDAgb2JqCjw8IC9MZW5ndGggNDUgMCBSIC9MZW5ndGgxIDI1ODY0IC9GaWx0ZXIgL0ZsYXRl
RGVjb2RlID4+CnN0cmVhbQp4AZW8CWAUVbY/fG9V9d6d3pfqfc3W2dPZSEgqhICCEEAQAkQCiCyC
EMF9AcdRlEVwQUF05I3bKCohgAZQQcVRRx10xN0ZGB8uMyPK+JDnE9L9/W5VJxCcee//pXPXulV1
62z3nHNP1bIrrpxDjGQF4Yk0e9HMJUT+Ez9HcWj2VcvCSttoJESz5tIlcxcpbftGQlQL5y689lKl
7cO480vmzZl5idImp1FWz0OH0qYplPF5i5Zdo7RFAeXHCxfPzh73dqN9+aKZ12TvT9j9w5fPXDRH
GX/JEZT5SxYvXZZtj0O5fskVc7Lj6RRC9NsHt/mDhGJUNY2S88ktREU4YiGlZBIh/MOqyURAmx1X
EVJ48OU7Z5gbftTqtPLlH0mMl+f1muG932Q0P68XTmmTOKCTx7MROE/9ZN8mQoR3MprMn4RTA0fk
85FV7yETM/v5/T2TKqVeFEPkYkdOvGIFmjsMJrns0VU2NZfy+8kSpG1IB5EEMgP58mwPT0KoNSGx
3nVIAtnC7yXdSPuR3kViPXvQswc9e9CzBz1NfC+h/PP8cz3xEGawc4cYr/i+2cvvIBkkjr+LX00i
uPbF2XJGtlyHshD967PlWn51T33I3KxDm5LvkWeQODzbgz0j2yp2y5WaBrmyub9n8w70hJpF/kHM
6kHM6kHM6kHM6nvkFFffjP7N6N+M/s1y/2ZC5UtFCrKXylYe7DG7sj2oNOv5dv4iUoFLTMmWk/mL
eipC+5o7+Um49DY538JPRH2dnM+Q8zY5Xy4fXS7XF8v1xXK9Sa43Zevs3FK5ruQhuW5mOT+Bv5AU
4O7j+VFyOY5vJQm029Bm5Vj+fLkcw4+UywvQ70H/aL6V2FCO4kfI7fPRHo72eWizciQ/omd4qKx5
CdozcIwjZp71D8dMhgOZwwEk1rMOaQvSYblnBvLlSAeReHkk5Yfj14JfM9+MMyRcQ8IRifC8hF8T
fo18I44MxdMMRS7xDXjeEPJSpCakNqQZSPuR3kXS8A3Iw3wVKUOSkMYhdSKpcJ0inFeEeRXhDkV8
MYnjWhFuDXGgDGfLELeaBNEOcqt7giGpWcftJOOQOpGWIK3gdvaobOZmB8axsaVIbUgzkJYjPYy0
DUlLmpDjiGTgmrgmvo1r4wVQd8GOhoYKuaysVkp/QCmN3gpz8xV8AcBUQB5G4jHlAky5AI/a3wqh
xoF08sg+pINIh5EYwPMAjDwAIw8PmIfz8+RRannc92hlkHiyGPlypLPHMNDk4ZHzcK8zV2G9+ejJ
xzXzcU4+rpcPMB5GTuUz2PFxSOuQ9iGxY1EcWyfnTcjbkDhcI4onYDUz8hAf7eF05l7Alw4xN9cA
7m1IOMitBTTXAm5rGYUAeqBtHGnKjliHchuSit+NXwF+efjl4xfFL4JfGL8QfkFgbz1+6/C7E7+1
+K3BbzWw4diW3JfkZlQtrlpeta7q4aptVfuqNHu5mfh1cp2SnrhckIk2q9bbbOEEMp2Y6M9y/oyc
XyHnkpy7Je9009HppjemmzZNN22Ybpoy3TR2umnEdFPpdFMvnSW5k6bPkqb1SdNFSVN10lSVNFUm
TQVJU7OVttPJxERekvNhcl4h51E5D9DJPSaie4FOIxEtKJ7m7YzcHPoy0ivQntAtkV4til8prWlK
Uc86nwuVReaGipSeXKWIR14UcAUyiT5NNDQpFWne1MzQSJo6TYmmWJOvydPENCGNQ2vTWrQ5WqNW
r9Vq1VpBy2mJ1tGbOSJhOaHEobawQo21kBJBrls4VkeGnHBUy5FRpNvOj+ZGXziMju7eP5uMnhXu
PnlhrJfqx0/tVsWG0W7baDJ64jBPd01ydK8mM6G7Njm6Wzdu2pTtlN7ZjlY3d3svJROn9NIM67rV
121rmbKbUFp061pftmxvZ+dM2S7QtWvbieuqJk+TrdFaN2L4v8g65c7O4ckzf54z1WSSzSTQfd/o
C6d0PxVo765glUygfTTgfGF4+pTdXC1X3Tp8N1fDivYpu/UruNrWCaxfv2I4JtI/joTRP3w3ibBC
HkfCbBwJnzMuyNWwcQlWKOOC8rjgoHHbh0Zah2+PIFPGDJXHDB08Zu7gMXPlMXOzY3h5/vIl+q+j
OUIi8piI5og897PHBJV7/a9jEv9yzFngnDPsrMYvqnQ3GUU/3N5yXeucWGtnrHUOUmf36qvmebpX
zAqHd5MW+iE7FO7mcztnzZ7HyplzeumHsTnDu1tiw8PbR8mnDj7efR07PCo2fDu5rnXilO3XSXOG
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
5cc9kFeMu+XI/EEvWw9qQEIxAx8f4HTiPVLFFtfghdJIfxg4/2Hfaq5WDi7pI9wVfScV425031D5
kwVvjOZeuYJB+HXEkm1AzPIQ7ByXk427PrB9EOU0ELLPB6tcUX80FURdcqASi8ZLrDYLb1YVTZOa
YMT1cp5dJKydJmHL1SNFSNhL8g6VGA8Jqjh0/kPe0pJ4JBI+RLwWL+cVK37ejc+wKu4y9uEKtr/J
8qN4eVYsLYVC4vEeE1F0oATA5BB4OFEg5GgSLyfj3SeYUfI7UCxKm5lXKbgdWChfDV6Cyn6qAZGS
sH0xUs1VV9jcw8pDepNXbKsaOazS73L5U83XTPR4TbpwRXM+/SE3WtyY3lR3vorXGSG2Klpn03k1
owXe5bC7eGF0DZ138Y0em82o51WjatIbm/BNT3ovvtFSJ8PqA8leGKXXRf8Q/XuUfypK/UWJ4pQH
y5eUg0ogiizEMjfDMkqEs/6FlfLbthFUguwEgb0QJoPWrAqOcY0hYQ2gy17blKGbnCYxOEsBBbpZ
kHoHgAx5DOC+wD2HgK699C3AF8tyFq5K8UvgAsjyBxJk3yQAPKAbQrW6ggKmCmSzrw30w505FrOg
lRUsFiIsg53bWGkFoMM6kyiOS41sqfS53b7UsGsuFEWjvh/QRY10Xu0ogcdnDWyeyuGXpDfKgLY7
ZECnNwLQdptRx6sA9blNYwn+2Bel8Ido8okoqNw4O6tGg2efOiDKF6aUL0s5EFvgggTw4F3C/i9D
5eFLUEWg7mp88amRSIR9u3EEGYlvRp6Pz6JfgO/ptuE7juPxDd4Lca9J+KLjZHyht51MJdPw5ccO
fOmqU74xJQjel2tqFsHQ0jr+wvbhyZbFV14xf84VY+dcPe7CMRPJ/wfJuNhLCmVuZHN0cmVhbQpl
bmRvYmoKNDUgMCBvYmoKMTc4NjkKZW5kb2JqCjEzIDAgb2JqCjw8IC9UeXBlIC9Gb250IC9TdWJ0
eXBlIC9UcnVlVHlwZSAvQmFzZUZvbnQgL05EREdITitDb3VyaWVyTmV3UFMtSXRhbGljTVQKL0Zv
bnREZXNjcmlwdG9yIDQ2IDAgUiAvRW5jb2RpbmcgL01hY1JvbWFuRW5jb2RpbmcgL0ZpcnN0Q2hh
ciA0NiAvTGFzdENoYXIKMTIxIC9XaWR0aHMgWyA2MDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
IDAgMCAwIDAgMCAwIDAgMCAwIDYwMCAwIDAgMCA2MDAgMCAwIDAgMCAwIDAgMCAwCjYwMCAwIDYw
MCAwIDYwMCAwIDYwMCAwIDAgMCAwIDYwMCBdID4+CmVuZG9iago0NiAwIG9iago8PCAvVHlwZSAv
Rm9udERlc2NyaXB0b3IgL0ZvbnROYW1lIC9ORERHSE4rQ291cmllck5ld1BTLUl0YWxpY01UIC9G
bGFncyA5NwovRm9udEJCb3ggWy0xMjQgLTI3NCA4MDAgMTAwMF0gL0l0YWxpY0FuZ2xlIC02IC9B
c2NlbnQgODMzIC9EZXNjZW50IC0zMDAgL0NhcEhlaWdodAo1NzEgL1N0ZW1WIDAgL1hIZWlnaHQg
NDIzIC9BdmdXaWR0aCA2MDAgL01heFdpZHRoIDYwMCAvRm9udEZpbGUyIDQ3IDAgUiA+PgplbmRv
YmoKNDcgMCBvYmoKPDwgL0xlbmd0aCA0OCAwIFIgL0xlbmd0aDEgOTc3NiAvRmlsdGVyIC9GbGF0
ZURlY29kZSA+PgpzdHJlYW0KeAG1enl8VNXZ8HPOuTN39rmzJJlJMltuJsFMhuwhCYEZsmMME0gw
M0jMhBAWFUkEQfBlqRsYRKJW6/qptX5aqeUmcZmgLWhdai1NtVatry28isunpdWKtFaSeZ97J0Gg
/b3f7/vjy51zznPO85zlPtt5zrnZeNXV/WCAncAg3LeudwCUv/T7sZD6Nm30pur8bwHU764aWL0u
VTc9DsBPrL5iy6pUPSMOYLpsTX/vylQdTmNZuQYbUnVSjmXumnUbr0nV0+Uy94r1fdP4jIuwbl/X
e830/PA+1r1X9q7rT9HnyUXxwPoNG1N1/6+xLB+4qn+ankRxfVeDPEtFikLJCeZa+BvUwjCogIIA
RbAMgP6S2wYc1mW8CuC+Qz1re8y1X2u0GqXbI+13PSEDL+vfeDDJJifUqzUEqbUKvYzAfuofT94D
wB1JsqlV6tXgA15GnPnTjsas5gVuthJpizAPYYpgYmDGPI5pGNNhTBx42CqkEjAPYdqHicFOtmpM
ayoNJ9iqUfO1peOsh24fXekxH6TXAWGXhsU/rfRMuCZ8EzkTuRNFE5GJ5RNfaSbSJ9wTnolZE4GJ
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
fPesRl0gM8hpQ/XRuUed2WkWp/OjdAHvlAZ+QT4ayE7z5XyUrTHYTPriSfX1CmIqW7ZTomEYvRkz
DbygRw8boSOy6DU6wZSl5r59+YwHxtMons1QS2FKxG+m8tn5/D8tNligAVpgMX6HXYrfX5YrdNZp
WjVkAyxqaGhuWRSoX3/1VWv7r1rUv7m9I7hwY+8Va/vacNT/BpEtY4oKZW5kc3RyZWFtCmVuZG9i
ago0OCAwIG9iago2OTc3CmVuZG9iagoxMiAwIG9iago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAv
VHJ1ZVR5cGUgL0Jhc2VGb250IC9RSkRJRFYrSGVsdmV0aWNhLU9ibGlxdWUgL0ZvbnREZXNjcmlw
dG9yCjQ5IDAgUiAvRW5jb2RpbmcgL01hY1JvbWFuRW5jb2RpbmcgL0ZpcnN0Q2hhciA5NyAvTGFz
dENoYXIgMTE2IC9XaWR0aHMgWyA1NTYKMCAwIDAgNTU2IDAgMCAwIDAgMCAwIDAgODMzIDU1NiA1
NTYgNTU2IDAgMzMzIDUwMCAyNzggXSA+PgplbmRvYmoKNDkgMCBvYmoKPDwgL1R5cGUgL0ZvbnRE
ZXNjcmlwdG9yIC9Gb250TmFtZSAvUUpESURWK0hlbHZldGljYS1PYmxpcXVlIC9GbGFncyA5NiAv
Rm9udEJCb3gKWy05MzMgLTQ4MSAxNTcxIDExMzhdIC9JdGFsaWNBbmdsZSAtNiAvQXNjZW50IDc3
MCAvRGVzY2VudCAtMjMwIC9DYXBIZWlnaHQKNzE3IC9TdGVtViA5OCAvWEhlaWdodCA1MjMgL1N0
ZW1IIDg1IC9BdmdXaWR0aCAtNDQxIC9NYXhXaWR0aCAxNTAwIC9Gb250RmlsZTIKNTAgMCBSID4+
CmVuZG9iago1MCAwIG9iago8PCAvTGVuZ3RoIDUxIDAgUiAvTGVuZ3RoMSA4Mjg4IC9GaWx0ZXIg
L0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ab1ZC3RURZr+697bjzQd6Lw6naST7k6n8w55SRIeQhO6
Q8IzEB7pSCQJSUiQYIwhggoTGRghIA7yFDwqOiISkSZB6CQCGY6sehwVdXzg6oyOz9mjy+6s7rpK
0vvV7XToxNHDnsPx3vPfqvqr6q+/vv//q+re29qyto6CqZ1EKq2obq4n+TLtQfKnFU3Vzb5y2FGk
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
uXlUuWVU+c5RZfnf/P8BvZJxFwplbmRzdHJlYW0KZW5kb2JqCjUxIDAgb2JqCjQ3MjcKZW5kb2Jq
CjUyIDAgb2JqCihJbXByb3ZlIFZhcmlhZGljIFRlbXBsYXRlcykKZW5kb2JqCjUzIDAgb2JqCihN
YWMgT1MgWCAxMC4xMS4zIFF1YXJ0eiBQREZDb250ZXh0KQplbmRvYmoKNTQgMCBvYmoKKFBhZ2Vz
KQplbmRvYmoKNTUgMCBvYmoKKEQ6MjAxNjAyMjgyMTE3NTZaMDAnMDAnKQplbmRvYmoKMSAwIG9i
ago8PCAvVGl0bGUgNTIgMCBSIC9Qcm9kdWNlciA1MyAwIFIgL0NyZWF0b3IgNTQgMCBSIC9DcmVh
dGlvbkRhdGUgNTUgMCBSIC9Nb2REYXRlCjU1IDAgUiA+PgplbmRvYmoKeHJlZgowIDU2CjAwMDAw
MDAwMDAgNjU1MzUgZiAKMDAwMDA5MzI0NiAwMDAwMCBuIAowMDAwMDA0NDE1IDAwMDAwIG4gCjAw
MDAwMTk1MTQgMDAwMDAgbiAKMDAwMDAwMDAyMiAwMDAwMCBuIAowMDAwMDA0Mzk1IDAwMDAwIG4g
CjAwMDAwMDQ1MjUgMDAwMDAgbiAKMDAwMDAxMDk1NyAwMDAwMCBuIAowMDAwMDQyMjM1IDAwMDAw
IG4gCjAwMDAwMDgxODUgMDAwMDAgbiAKMDAwMDAzMzMwNiAwMDAwMCBuIAowMDAwMDYxMzYxIDAw
MDAwIG4gCjAwMDAwODc3NDYgMDAwMDAgbiAKMDAwMDA4MDA1NiAwMDAwMCBuIAowMDAwMDU3ODE0
IDAwMDAwIG4gCjAwMDAwMDQ2OTMgMDAwMDAgbiAKMDAwMDAwODE2NCAwMDAwMCBuIAowMDAwMDA4
MjIxIDAwMDAwIG4gCjAwMDAwMTA5MzYgMDAwMDAgbiAKMDAwMDAxNDU1NCAwMDAwMCBuIAowMDAw
MDEwOTkzIDAwMDAwIG4gCjAwMDAwMTQ1MzMgMDAwMDAgbiAKMDAwMDAxNDY2NyAwMDAwMCBuIAow
MDAwMDE5NjY3IDAwMDAwIG4gCjAwMDAwMTkyMjAgMDAwMDAgbiAKMDAwMDAxNDgzNiAwMDAwMCBu
IAowMDAwMDE5MTk5IDAwMDAwIG4gCjAwMDAwMTkzMzMgMDAwMDAgbiAKMDAwMDAxOTYxNyAwMDAw
MCBuIAowMDAwMDE5OTMzIDAwMDAwIG4gCjAwMDAwMjAxODAgMDAwMDAgbiAKMDAwMDAzMzI4NCAw
MDAwMCBuIAowMDAwMDMzNzI1IDAwMDAwIG4gCjAwMDAwMzM5ODMgMDAwMDAgbiAKMDAwMDA0MjIx
NCAwMDAwMCBuIAowMDAwMDQyOTMwIDAwMDAwIG4gCjAwMDAwNDMxODAgMDAwMDAgbiAKMDAwMDA1
Nzc5MiAwMDAwMCBuIAowMDAwMDU4Mjk2IDAwMDAwIG4gCjAwMDAwNTc5NzcgMDAwMDAgbiAKMDAw
MDA1ODI3NiAwMDAwMCBuIAowMDAwMDU4NTQ1IDAwMDAwIG4gCjAwMDAwNjEzNDAgMDAwMDAgbiAK
MDAwMDA2MTgzMiAwMDAwMCBuIAowMDAwMDYyMDc0IDAwMDAwIG4gCjAwMDAwODAwMzQgMDAwMDAg
biAKMDAwMDA4MDQwOCAwMDAwMCBuIAowMDAwMDgwNjU4IDAwMDAwIG4gCjAwMDAwODc3MjUgMDAw
MDAgbiAKMDAwMDA4Nzk4NCAwMDAwMCBuIAowMDAwMDg4MjQ0IDAwMDAwIG4gCjAwMDAwOTMwNjEg
MDAwMDAgbiAKMDAwMDA5MzA4MiAwMDAwMCBuIAowMDAwMDkzMTI3IDAwMDAwIG4gCjAwMDAwOTMx
ODAgMDAwMDAgbiAKMDAwMDA5MzIwNCAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDU2IC9Sb290
IDI4IDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8NTc4ZmU0MmQwNjlmMjdjMzIxNDY5NWRhMGI2ZTA1
MGI+Cjw1NzhmZTQyZDA2OWYyN2MzMjE0Njk1ZGEwYjZlMDUwYj4gXSA+PgpzdGFydHhyZWYKOTMz
NTEKJSVFT0YK
--Apple-Mail=_0EC48875-5CBD-491A-BDCC-BBC12DB90ADE
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8

<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dus-ascii"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode=
: space; -webkit-line-break: after-white-space;" class=3D""><div class=3D""=
></div></body></html>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/7199947E-F020-402B-B5FC-D747CE6224FC%=
40gmx.de?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.com/=
a/isocpp.org/d/msgid/std-proposals/7199947E-F020-402B-B5FC-D747CE6224FC%40g=
mx.de</a>.<br />

--Apple-Mail=_0EC48875-5CBD-491A-BDCC-BBC12DB90ADE--
--Apple-Mail=_0FBD0648-BDF2-4A6E-AF0E-4D11C1AF4CD7--
--Apple-Mail=_3DF3200F-CD2C-41F2-AEC5-1B057CC4B857
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename=signature.asc
Content-Type: application/pgp-signature;
 name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iEYEARECAAYFAlbTZ4QACgkQAUxJbew56yFO+gCfZCPPh4Ghslr3nF3we16I6Pt7
EC4AoMvkc6DJ0nDkSFLkwrY6s0yRtD6Q
=kDoE
-----END PGP SIGNATURE-----

--Apple-Mail=_3DF3200F-CD2C-41F2-AEC5-1B057CC4B857--

.


Author: Arthur O'Dwyer <arthur.j.odwyer@gmail.com>
Date: Sun, 28 Feb 2016 21:36:06 -0800 (PST)
Raw View
------=_Part_195_950172988.1456724176487
Content-Type: multipart/alternative;
 boundary="----=_Part_196_1369546372.1456724176487"

------=_Part_196_1369546372.1456724176487
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

On Sunday, February 28, 2016 at 1:32:56 PM UTC-8, Daniel Frey wrote:
>
> I=E2=80=99d like to propose three basic functionalities wrt parameter pac=
ks.
>
> 1) Allow expansion of only a single element via pattern...[I].
> 2) Allow in-situ creation of unexpanded non-type parameter packs via Type=
....=20
> N.
> 3) Allow aliases via using Is =3D std::size_t... 5.
>
=20
Example 2 under "Pack Aliases" is:

template<typename... Ts> using Ds =3D decay_t<Ts>;

Presumably you're thinking of using Ds like this:

template<typename... X> void foo(Ds<X>... ds);

being a synonym for

template<typename... X> void foo(std::decay_t<X>... ds);

But that's not a "pack alias"; that's just a plain old alias template! You=
=20
can get that effect today by writing

template<typename T> using Ds =3D decay_t<T>;
template<typename... X> void foo(Ds<X>... ds);

The first example is better, because it gives us something we don't already=
=20
have; namely a way to make a synonym for a naked pack. But I think you run=
=20
into trouble there, because once you have the ability to create a pack from=
=20
a non-pack, you can do things like this:

template<int J> using Is =3D size_t... J;  // new "pack alias" syntax
template<int K> void foo() { return f(Is<K>...); }  // return=20
f(0,1,2,3...K-1)
template<int... L> void bar() { return f(g(Is<L>...)...; }  // return=20
f(g(0,1,2,3...L1-1), g(0,1,2,3...L2-1), ...) ???
template<int... M> void baz() { return f(Is<M>... ...);  // return=20
f(0,1,2,3...L1-1, 0,1,2,3...L2-1,...) ???
template<int N> void baz() { return f(Is<Is<N>>... ...);  // return ???

I ran into similar problems with my tuple-exploding tilde-notation (let x~=
=20
be a pack consisting of all the elements of tuple x). Either there are=20
fundamental semantic problems that mean you can't do this, period; or else=
=20
the syntax is so confusing that it *seems* like there are fundamental=20
problems when there aren't. :)

No specific comment on the other proposals, except to say that they don't=
=20
add any new expressiveness to the language, just core-language syntactic=20
sugar for constructs we can already express efficiently through the=20
standard library (tuple_element_t, for example), and therefore I don't=20
think they stand much chance. Also, they use up valuable syntactic real=20
estate, so I don't think they *should* be adopted.

my $.02,
=E2=80=93Arthur

>

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/5d3c108e-aed7-47d9-9fb5-f05f6fa62680%40isocpp.or=
g.

------=_Part_196_1369546372.1456724176487
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">On Sunday, February 28, 2016 at 1:32:56 PM UTC-8, Daniel F=
rey wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left:=
 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div style=3D"word-w=
rap:break-word"><font face=3D"Helvetica">I=E2=80=99d like to propose three =
basic functionalities wrt parameter packs.</font><div><font face=3D"Helveti=
ca"><br></font></div><div>1) Allow expansion of only a single element via <=
font face=3D"Courier">pattern...[I]</font>.</div><div><div><font face=3D"He=
lvetica">2) Allow in-situ creation of unexpanded non-type parameter packs v=
ia=C2=A0</font><font face=3D"Courier">Type... N</font><font face=3D"Helveti=
ca">.</font></div></div><div><font face=3D"Helvetica">3) Allow aliases via =
</font><font face=3D"Courier">using Is =3D std::size_t... 5</font><font fac=
e=3D"Helvetica">.</font></div></div></blockquote><div>=C2=A0</div><div>Exam=
ple 2 under &quot;Pack Aliases&quot; is:</div><div><br></div><div>template&=
lt;typename... Ts&gt; using Ds =3D decay_t&lt;Ts&gt;;</div><div><br></div><=
div>Presumably you&#39;re thinking of using Ds like this:</div><div><br></d=
iv><div>template&lt;typename... X&gt; void foo(Ds&lt;X&gt;... ds);</div><di=
v><br></div><div>being a synonym for</div><div><br></div><div><div>template=
&lt;typename... X&gt; void foo(std::decay_t&lt;X&gt;... ds);</div></div><di=
v><br></div><div>But that&#39;s not a &quot;pack alias&quot;; that&#39;s ju=
st a plain old alias template! You can get that effect today by writing</di=
v><div><br></div><div><div>template&lt;typename T&gt; using Ds =3D decay_t&=
lt;T&gt;;</div></div><div><div>template&lt;typename... X&gt; void foo(Ds&lt=
;X&gt;... ds);</div></div><div><br></div><div>The first example is better, =
because it gives us something we don&#39;t already have; namely a way to ma=
ke a synonym for a naked pack. But I think you run into trouble there, beca=
use once you have the ability to create a pack from a non-pack, you can do =
things like this:</div><div><br></div><div>template&lt;int J&gt; using Is =
=3D size_t... J; =C2=A0// new &quot;pack alias&quot; syntax</div><div>templ=
ate&lt;int K&gt; void foo() { return f(Is&lt;K&gt;...); } =C2=A0// return f=
(0,1,2,3...K-1)<br></div><div>template&lt;int... L&gt; void bar() { return =
f(g(Is&lt;L&gt;...)...; } =C2=A0// return f(g(0,1,2,3...L1-1), g(0,1,2,3...=
L2-1), ...) ???</div><div>template&lt;int... M&gt; void baz() { return f(Is=
&lt;M&gt;... ...); =C2=A0// return f(0,1,2,3...L1-1, 0,1,2,3...L2-1,...) ??=
?</div><div><div>template&lt;int N&gt; void baz() { return f(Is&lt;Is&lt;N&=
gt;&gt;... ...); =C2=A0// return ???</div></div><div><br></div><div>I ran i=
nto similar problems with my tuple-exploding tilde-notation (let <font face=
=3D"courier new, monospace">x~</font> be a pack consisting of all the eleme=
nts of tuple <font face=3D"courier new, monospace">x</font>). Either there =
are fundamental semantic problems that mean you can&#39;t do this, period; =
or else the syntax is so confusing that it <i>seems</i> like there are fund=
amental problems when there aren&#39;t. :)</div><div><br></div><div>No spec=
ific comment on the other proposals, except to say that they don&#39;t add =
any new expressiveness to the language, just core-language syntactic sugar =
for constructs we can already express efficiently through the standard libr=
ary (tuple_element_t, for example), and therefore I don&#39;t think they st=
and much chance. Also, they use up valuable syntactic real estate, so I don=
&#39;t think they <i>should</i> be adopted.</div><div><br></div><div>my $.0=
2,</div><div>=E2=80=93Arthur</div><blockquote class=3D"gmail_quote" style=
=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: =
1ex;"><div style=3D"word-wrap:break-word"><div></div></div></blockquote></d=
iv>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/5d3c108e-aed7-47d9-9fb5-f05f6fa62680%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/5d3c108e-aed7-47d9-9fb5-f05f6fa62680=
%40isocpp.org</a>.<br />

------=_Part_196_1369546372.1456724176487--
------=_Part_195_950172988.1456724176487--

.


Author: Daniel Frey <d.frey@gmx.de>
Date: Tue, 1 Mar 2016 22:27:11 +0100
Raw View
--Apple-Mail=_7EF8C93D-4F51-4811-A406-FD01D61E9605
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8

> On 29.02.2016, at 06:36, Arthur O'Dwyer <arthur.j.odwyer@gmail.com> wrote=
:
>=20
> On Sunday, February 28, 2016 at 1:32:56 PM UTC-8, Daniel Frey wrote:
> I=E2=80=99d like to propose three basic functionalities wrt parameter pac=
ks.
>=20
> 1) Allow expansion of only a single element via pattern...[I].
> 2) Allow in-situ creation of unexpanded non-type parameter packs via Type=
.... N.
> 3) Allow aliases via using Is =3D std::size_t... 5.
>=20
> Example 2 under "Pack Aliases" is:

[...]

> The first example is better, because it gives us something we don't alrea=
dy have; namely a way to make a synonym for a naked pack. But I think you r=
un into trouble there, because once you have the ability to create a pack f=
rom a non-pack, you can do things like this:

Good catch. Maybe the 3rd proposal (pack aliases) is too much. I=E2=80=99ll=
 reconsider that one, so let=E2=80=99s focus on the first two for now.

> No specific comment on the other proposals, except to say that they don't=
 add any new expressiveness to the language, just core-language syntactic s=
ugar for constructs we can already express efficiently through the standard=
 library (tuple_element_t, for example), and therefore I don't think they s=
tand much chance. Also, they use up valuable syntactic real estate, so I do=
n't think they should be adopted.

FWIW, three compilers (VC++, GCC, Clang) are implementing a compiler intrin=
sic called __make_integer_seq which could be replaced by 2) and we gain the=
 following advantages:

- More expressiveness as an unexpanded parameter pack is generated, not jus=
t an instance of a class (std::integer_sequence)
- Portable, standardized syntax

The fact that those three compilers are already implementing __make_integer=
_seq also shows that the general benefits are significant enough to warrant=
 such a step. I arrived at the above proposal (especially 1) and 2)) while =
trying to avoid recursive implementations of variadic functions when creati=
ng a better tuple. If you want to study some background, this is the core o=
f tuple_element_t:

https://github.com/taocpp/sequences/blob/master/include/tao/seq/type_by_ind=
ex.hpp

when you don=E2=80=99t have 1) available. It=E2=80=99s ugly, hard to unders=
tand, hard to teach as well as time and memory consuming. Further material =
to study if you are interested:

https://github.com/taocpp/sequences
https://github.com/taocpp/tuple

Even without 1) and 2), the non-recursive implementations allowed some sign=
ificant improvements against libstd++ and libc++, some numbers for one exam=
ple (generating a std::tuple with 265 elements via std::tuple_cat, MID=3Dma=
ximum instantiation depth):

Linux, GCC5 + libstdc++, std::tuple: 19.6s, MID 3719
Linux, GCC5 + libstdc++, tao::tuple:  1.2s, MID 26
MacOS, Apple LLVM 7.0 (Clang ~3.7), std::tuple: 70.0s, MID 514
MacOS, Apple LLVM 7.0 (Clang ~3.7), tao::tuple:  1.7s, MID 15

This means that the amount of instantiations, and thereby the memory used b=
y the compiler when working with variadic templates can have a great impact=
 on compile times. C++ has a reputation for being slow to compile, improvem=
ents in this area are more than just syntactic sugar IMHO. While working on=
 the above, I realized that the need for 1) and 2) comes up over and over a=
gain. I believe that adding them to the language can lead to real-world ben=
efits as variadic templates are used more and more and often they are used =
behind the scenes. Even if the user doesn=E2=80=99t see it directly, but I =
think that the average compile time of most projects will benefit.

Daniel

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/C4885361-8901-4D28-9CAB-0FF0C4E8B258%40gmx.de.

--Apple-Mail=_7EF8C93D-4F51-4811-A406-FD01D61E9605
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename=signature.asc
Content-Type: application/pgp-signature;
 name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iEYEARECAAYFAlbWCS8ACgkQAUxJbew56yGR3gCfbtcA1qHrIUbd/B0N75hhb/fs
ir0An3tG2CaNvYR8oUlWPCFx6y0xkU4e
=RVNJ
-----END PGP SIGNATURE-----

--Apple-Mail=_7EF8C93D-4F51-4811-A406-FD01D61E9605--

.


Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Tue, 1 Mar 2016 17:50:11 -0800
Raw View
--001a114699503eeae4052d071a2c
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

On Tue, Mar 1, 2016 at 1:27 PM, Daniel Frey <d.frey@gmx.de> wrote:
> On 29.02.2016, at 06:36, Arthur O'Dwyer <arthur.j.odwyer@gmail.com> wrote=
:
> > On Sunday, February 28, 2016 at 1:32:56 PM UTC-8, Daniel Frey wrote:
> > > I=E2=80=99d like to propose three basic functionalities wrt parameter=
 packs.
> > >
> > > 1) Allow expansion of only a single element via pattern...[I].
> > > 2) Allow in-situ creation of unexpanded non-type parameter packs via
Type... N.
> > > 3) Allow aliases via using Is =3D std::size_t... 5.
>
> > No specific comment on the other proposals (1 and 2), except to say
that they don't add
> > any new expressiveness to the language, just core-language syntactic
sugar for constructs
> > we can already express efficiently through the standard library
(tuple_element_t, for
> > example), and therefore I don't think they stand much chance. Also,
they use up
> > valuable syntactic real estate, so I don't think they should be adopted=
..
>
> FWIW, three compilers (VC++, GCC, Clang) are implementing a compiler
intrinsic
> called __make_integer_seq which could be replaced by 2) and we gain the
following
> advantages:
>
> - More expressiveness as an unexpanded parameter pack is generated, not
just an instance of a class (std::integer_sequence)
> - Portable, standardized syntax

In the part of my post that you snipped, I indicated that "generating an
unexpanded parameter pack" is a liability, not an advantage. You seemed to
agree ("Good catch ... I'll reconsider that one ...").  Maybe I should say
is *currently* a liability. It would be awesome to have first-class
parameter packs, but I think there are deep problems someone needs to solve
before we can get them.

Portable, standardized syntax for std::make_integer_sequence *already
exists*; it's std::make_integer_sequence!
You have correctly noticed that current implementations of
make_integer_sequence are pretty slow, and that recently there's been some
behind-the-scenes work in VC++, GCC, and Clang to speed
up make_integer_sequence via the use of compiler builtins. However, as a
user of C++1z, I don't need to know about these builtins; I just use the
same syntax I've used since C++11 (std::make_integer_sequence), and it's
magically faster, and that's awesome.

My understanding is that, as an *implementor of* the C++ standard library,
I probably *would* need to know about these compiler builtins. But the
whole point of the standard library is to hide the nitty-gritty of builtins
behind nice standardized facades. And we *already have* a facade for
generating integer sequences; it's std::make_integer_sequence. We *already
have* a facade for extracting one element from a tuple; it's
std::tuple_element_t. We don't need more *facades*, more *syntax*. What we
need is more behind-the-scenes magic to make the *existing* syntax *faster*=
....
and we're already getting that, too, in all three major compilers, right?


> If you want to study some background, this is the core of tuple_element_t=
:
>
>
https://github.com/taocpp/sequences/blob/master/include/tao/seq/type_by_ind=
ex.hpp
>
> when you don=E2=80=99t have 1) available. It=E2=80=99s ugly, hard to unde=
rstand, hard to
teach as well as time and memory consuming.

I guess I don't understand... isn't that just a reimplementation of
std::tuple_element_t with a weird name?
In practice I'd never implement std::tuple_element_t yourself; I'd use the
library implementation, which will be implemented in terms of the magically
fast compiler builtins.
What does that code look like if you take all the identifiers and rename
them according to standard library names, e.g. std::get<> instead of
get_nth<>, std::tuple_element<> instead of type_by_index<>, etc.?  And then
at that point, is there any actual *code* left, or are all those lines of
code just reimplementing things that already exist in the standard library?


> Further material to study if you are interested:
>
> https://github.com/taocpp/sequences
> https://github.com/taocpp/tuple
>
> Even without 1) and 2), the non-recursive implementations allowed some
significant improvements against libstd++ and libc++, some numbers for one
example (generating a std::tuple with 265 elements via std::tuple_cat,
MID=3Dmaximum instantiation depth):
>
> Linux, GCC5 + libstdc++, std::tuple: 19.6s, MID 3719
> Linux, GCC5 + libstdc++, tao::tuple:  1.2s, MID 26
> MacOS, Apple LLVM 7.0 (Clang ~3.7), std::tuple: 70.0s, MID 514
> MacOS, Apple LLVM 7.0 (Clang ~3.7), tao::tuple:  1.7s, MID 15

Well, that seems like a massive improvement! Either tao::tuple is missing
something that std::tuple provides (i.e. it's trading functionality for
speed), or else it's just massively better, in which case I would fully
expect all the major vendors (MSVC++, libstdc++, libc++) to adopt it
relatively quickly.
Did tao::tuple use the above-proposed core language changes to achieve that
speed, or does it achieve speed based only on the existing core language
plus vendor magic like __make_integer_seq (which is equally available to
the writers of libc++)?  If the latter, then tao::tuple is just a better
implementation of std::tuple, and I hope it gets picked up quickly.

=E2=80=93Arthur

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/CADvuK0%2BF3HduGbWEMu%3D4CVQjTaJjK62HeiNiiybHhjc=
xWCX1Qw%40mail.gmail.com.

--001a114699503eeae4052d071a2c
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">On Tue, Mar 1, 2016 at 1:27 PM, Daniel Frey &lt;<a href=3D=
"mailto:d.frey@gmx.de">d.frey@gmx.de</a>&gt; wrote:<br>&gt; On 29.02.2016, =
at 06:36, Arthur O&#39;Dwyer &lt;<a href=3D"mailto:arthur.j.odwyer@gmail.co=
m">arthur.j.odwyer@gmail.com</a>&gt; wrote:<br>&gt; &gt; On Sunday, Februar=
y 28, 2016 at 1:32:56 PM UTC-8, Daniel Frey wrote:<br>&gt; &gt; &gt; I=E2=
=80=99d like to propose three basic functionalities wrt parameter packs.<br=
>&gt; &gt; &gt;<br>&gt; &gt; &gt; 1) Allow expansion of only a single eleme=
nt via pattern...[I].<br>&gt; &gt; &gt; 2) Allow in-situ creation of unexpa=
nded non-type parameter packs via Type... N.<br>&gt; &gt; &gt; 3) Allow ali=
ases via using Is =3D std::size_t... 5.<br>&gt;<br>&gt; &gt; No specific co=
mment on the other proposals (1 and 2), except to say that they don&#39;t a=
dd<br>&gt; &gt; any new expressiveness to the language, just core-language =
syntactic sugar for constructs<br>&gt; &gt; we can already express efficien=
tly through the standard library (tuple_element_t, for<br>&gt; &gt; example=
), and therefore I don&#39;t think they stand much chance. Also, they use u=
p<br>&gt; &gt; valuable syntactic real estate, so I don&#39;t think they sh=
ould be adopted.<br>&gt;<br>&gt; FWIW, three compilers (VC++, GCC, Clang) a=
re implementing a compiler intrinsic<br>&gt; called __make_integer_seq whic=
h could be replaced by 2) and we gain the following<br>&gt; advantages:<br>=
&gt;<br>&gt; - More expressiveness as an unexpanded parameter pack is gener=
ated, not just an instance of a class (std::integer_sequence)<br>&gt; - Por=
table, standardized syntax<br><br>In the part of my post that you snipped, =
I indicated that &quot;generating an unexpanded parameter pack&quot; is a l=
iability, not an advantage. You seemed to agree (&quot;Good catch ... I&#39=
;ll reconsider that one ...&quot;).=C2=A0 Maybe I should say is <i>currentl=
y</i> a liability. It would be awesome to have first-class parameter packs,=
 but I think there are deep problems someone needs to solve before we can g=
et them.<div><br></div><div>Portable, standardized syntax for std::make_int=
eger_sequence <i>already exists</i>; it&#39;s=C2=A0std::make_integer_sequen=
ce!</div><div>You have correctly noticed that current implementations of ma=
ke_integer_sequence are pretty slow, and that recently there&#39;s been som=
e behind-the-scenes work in VC++, GCC, and Clang to speed up=C2=A0make_inte=
ger_sequence via the use of compiler builtins. However, as a user of C++1z,=
 I don&#39;t need to know about these builtins; I just use the same syntax =
I&#39;ve used since C++11 (std::make_integer_sequence), and it&#39;s magica=
lly faster, and that&#39;s awesome.</div><div><br></div><div>My understandi=
ng is that, as an <i>implementor of</i> the C++ standard library, I probabl=
y=C2=A0<i>would</i>=C2=A0need to know about these compiler builtins. But th=
e whole point of the standard library is to hide the nitty-gritty of builti=
ns behind nice standardized facades. And we <i>already have</i> a facade fo=
r generating integer sequences; it&#39;s std::make_integer_sequence. We <i>=
already have</i> a facade for extracting one element from a tuple; it&#39;s=
 std::tuple_element_t. We don&#39;t need more <i>facades</i>, more <i>synta=
x</i>. What we need is more behind-the-scenes magic to make the <i>existing=
</i> syntax <i>faster</i>... and we&#39;re already getting that, too, in al=
l three major compilers, right?<br><br><br>&gt;=C2=A0If you want to study s=
ome background, this is the core of tuple_element_t:<br>&gt;<br>&gt; <a hre=
f=3D"https://github.com/taocpp/sequences/blob/master/include/tao/seq/type_b=
y_index.hpp">https://github.com/taocpp/sequences/blob/master/include/tao/se=
q/type_by_index.hpp</a><br>&gt;<br>&gt; when you don=E2=80=99t have 1) avai=
lable. It=E2=80=99s ugly, hard to understand, hard to teach as well as time=
 and memory consuming.=C2=A0</div><div><br></div><div>I guess I don&#39;t u=
nderstand... isn&#39;t that just a reimplementation of std::tuple_element_t=
 with a weird name?</div><div>In practice I&#39;d never implement std::tupl=
e_element_t yourself; I&#39;d use the library implementation, which will be=
 implemented in terms of the magically fast compiler builtins.</div><div>Wh=
at does that code look like if you take all the identifiers and rename them=
 according to standard library names, e.g. std::get&lt;&gt; instead of get_=
nth&lt;&gt;, std::tuple_element&lt;&gt; instead of type_by_index&lt;&gt;, e=
tc.?=C2=A0 And then at that point, is there any actual <i>code</i> left, or=
 are all those lines of code just reimplementing things that already exist =
in the standard library?</div><div><br></div><div><br></div><div>&gt; Furth=
er material to study if you are interested:<br>&gt;<br>&gt; <a href=3D"http=
s://github.com/taocpp/sequences">https://github.com/taocpp/sequences</a><br=
>&gt; <a href=3D"https://github.com/taocpp/tuple">https://github.com/taocpp=
/tuple</a><br>&gt;<br>&gt; Even without 1) and 2), the non-recursive implem=
entations allowed some significant improvements against libstd++ and libc++=
, some numbers for one example (generating a std::tuple with 265 elements v=
ia std::tuple_cat, MID=3Dmaximum instantiation depth):<br>&gt;<br>&gt; Linu=
x, GCC5 + libstdc++, std::tuple: 19.6s, MID 3719<br>&gt; Linux, GCC5 + libs=
tdc++, tao::tuple: =C2=A01.2s, MID 26<br>&gt; MacOS, Apple LLVM 7.0 (Clang =
~3.7), std::tuple: 70.0s, MID 514<br>&gt; MacOS, Apple LLVM 7.0 (Clang ~3.7=
), tao::tuple: =C2=A01.7s, MID 15</div><div><br></div><div>Well, that seems=
 like a massive improvement! Either tao::tuple is missing something that st=
d::tuple provides (i.e. it&#39;s trading functionality for speed), or else =
it&#39;s just massively better, in which case I would fully expect all the =
major vendors (MSVC++, libstdc++, libc++) to adopt it relatively quickly.</=
div><div>Did tao::tuple use the above-proposed core language changes to ach=
ieve that speed, or does it achieve speed based only on the existing core l=
anguage plus vendor magic like __make_integer_seq (which is equally availab=
le to the writers of libc++)?=C2=A0 If the latter, then tao::tuple is just =
a better implementation of std::tuple, and I hope it gets picked up quickly=
..</div><div><br></div><div>=E2=80=93Arthur</div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CADvuK0%2BF3HduGbWEMu%3D4CVQjTaJjK62H=
eiNiiybHhjcxWCX1Qw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter"=
>https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0%2BF3H=
duGbWEMu%3D4CVQjTaJjK62HeiNiiybHhjcxWCX1Qw%40mail.gmail.com</a>.<br />

--001a114699503eeae4052d071a2c--

.


Author: Daniel Frey <d.frey@gmx.de>
Date: Wed, 2 Mar 2016 20:34:15 +0100
Raw View
--Apple-Mail=_986E7DE1-FE2A-429D-8D5F-988D6B05A947
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8

> On 02.03.2016, at 02:50, Arthur O'Dwyer <arthur.j.odwyer@gmail.com> wrote=
:
>=20
> On Tue, Mar 1, 2016 at 1:27 PM, Daniel Frey <d.frey@gmx.de> wrote:
> > On 29.02.2016, at 06:36, Arthur O'Dwyer <arthur.j.odwyer@gmail.com> wro=
te:
> > > On Sunday, February 28, 2016 at 1:32:56 PM UTC-8, Daniel Frey wrote:
> > > > I=E2=80=99d like to propose three basic functionalities wrt paramet=
er packs.
> > > >
> > > > 1) Allow expansion of only a single element via pattern...[I].
> > > > 2) Allow in-situ creation of unexpanded non-type parameter packs vi=
a Type... N.
> > > > 3) Allow aliases via using Is =3D std::size_t... 5.
> >
> > > No specific comment on the other proposals (1 and 2), except to say t=
hat they don't add
> > > any new expressiveness to the language, just core-language syntactic =
sugar for constructs
> > > we can already express efficiently through the standard library (tupl=
e_element_t, for
> > > example), and therefore I don't think they stand much chance. Also, t=
hey use up
> > > valuable syntactic real estate, so I don't think they should be adopt=
ed.
> >
> > FWIW, three compilers (VC++, GCC, Clang) are implementing a compiler in=
trinsic
> > called __make_integer_seq which could be replaced by 2) and we gain the=
 following
> > advantages:
> >
> > - More expressiveness as an unexpanded parameter pack is generated, not=
 just an instance of a class (std::integer_sequence)
> > - Portable, standardized syntax
>=20
> In the part of my post that you snipped, I indicated that "generating an =
unexpanded parameter pack" is a liability, not an advantage. You seemed to =
agree ("Good catch ... I'll reconsider that one ...").  Maybe I should say =
is currently a liability. It would be awesome to have first-class parameter=
 packs, but I think there are deep problems someone needs to solve before w=
e can get them.

When I said =E2=80=9CGood catch=E2=80=9D I meant that you spotted a problem=
 that I haven=E2=80=99t realized before. It=E2=80=99s an interesting proble=
m and, of course, it makes me reconsider given that you, IIUC, raised it in=
 the context of my proposed language addition 3). That said, I have now tho=
ught about it some more and I think that the problem is completely independ=
ent of what I=E2=80=99m suggesting. This problem should be solved in its ow=
n proposal. My proposal addresses a different issue as I=E2=80=99ll try to =
explain below.

> Portable, standardized syntax for std::make_integer_sequence already exis=
ts; it's std::make_integer_sequence!
> You have correctly noticed that current implementations of make_integer_s=
equence are pretty slow, and that recently there's been some behind-the-sce=
nes work in VC++, GCC, and Clang to speed up make_integer_sequence via the =
use of compiler builtins. However, as a user of C++1z, I don't need to know=
 about these builtins; I just use the same syntax I've used since C++11 (st=
d::make_integer_sequence), and it's magically faster, and that's awesome.
>=20
> My understanding is that, as an implementor of the C++ standard library, =
I probably would need to know about these compiler builtins. But the whole =
point of the standard library is to hide the nitty-gritty of builtins behin=
d nice standardized facades. And we already have a facade for generating in=
teger sequences; it's std::make_integer_sequence. We already have a facade =
for extracting one element from a tuple; it's std::tuple_element_t. We don'=
t need more facades, more syntax. What we need is more behind-the-scenes ma=
gic to make the existing syntax faster... and we're already getting that, t=
oo, in all three major compilers, right?

I disagree, and I=E2=80=99ll try to explain why: The whole point of my prop=
osal is that having at least 1) and 2) and maybe also 3) is the bread and b=
utter needed for efficient handling of variadic templates. With std::make_i=
ndex_sequence, you end up instantiating a template - even if you do so with=
 a compiler intrinsic. The result is a type, not a parameter pack. If you n=
eed the latter (and you very often do need the latter), you need to write a=
nother method, forward the type to it and extract the parameter pack by ded=
uction. You thereby instantiate another function/method.

The number of instantiations created just because of the lack of what I=E2=
=80=99m proposing is not to be underestimated. I learned this lesson when w=
orking on tao::tuple. It started when I listened to a talk in the C++ user =
group in Aachen where the shown solutions for working with variadic templat=
es where almost all recursive. I already knew from my workplace that recurs=
ion leads to tons of instantiations, so I offered to give an alternative ta=
lk to show how to do things without recursion. When I started to write the =
slides, I realized that I should also back up the claimed importance with s=
ome numbers, so I created taocpp/sequence and taocpp/tuple. I was more than=
 surprised to find out that the benefits for tuple, especially tuple_cat wh=
ere much larger than I anticipated. What I also learned is that you can not=
 simply pin the inefficiency to a single method, e.g., make_integer_sequenc=
e or tuple_element_t.

While working on toacpp, I also realized that there are two things missing =
to get rid of another bunch of instantiations and also of some overly compl=
icated code. This is what lead to my proposal, points 1) and 2). Point 3) i=
s mostly the logical extension.

> > If you want to study some background, this is the core of tuple_element=
_t:
> >
> > https://github.com/taocpp/sequences/blob/master/include/tao/seq/type_by=
_index.hpp
> >
> > when you don=E2=80=99t have 1) available. It=E2=80=99s ugly, hard to un=
derstand, hard to teach as well as time and memory consuming.
>=20
> I guess I don't understand... isn't that just a reimplementation of std::=
tuple_element_t with a weird name?
> In practice I'd never implement std::tuple_element_t yourself; I'd use th=
e library implementation, which will be implemented in terms of the magical=
ly fast compiler builtins.
> What does that code look like if you take all the identifiers and rename =
them according to standard library names, e.g. std::get<> instead of get_nt=
h<>, std::tuple_element<> instead of type_by_index<>, etc.?  And then at th=
at point, is there any actual code left, or are all those lines of code jus=
t reimplementing things that already exist in the standard library?

type_by_index is used to implement tuple_element_t, among others. But the p=
oint is that the interface, std::tuple_element_t, is a bad interface as you=
 are again creating instantiations. Even without a full instantiation, the =
compiler still creates some entity for the type.

> > Linux, GCC5 + libstdc++, std::tuple: 19.6s, MID 3719
> > Linux, GCC5 + libstdc++, tao::tuple:  1.2s, MID 26
> > MacOS, Apple LLVM 7.0 (Clang ~3.7), std::tuple: 70.0s, MID 514
> > MacOS, Apple LLVM 7.0 (Clang ~3.7), tao::tuple:  1.7s, MID 15
>=20
> Well, that seems like a massive improvement! Either tao::tuple is missing=
 something that std::tuple provides (i.e. it's trading functionality for sp=
eed), or else it's just massively better, in which case I would fully expec=
t all the major vendors (MSVC++, libstdc++, libc++) to adopt it relatively =
quickly.
> Did tao::tuple use the above-proposed core language changes to achieve th=
at speed, or does it achieve speed based only on the existing core language=
 plus vendor magic like __make_integer_seq (which is equally available to t=
he writers of libc++)?  If the latter, then tao::tuple is just a better imp=
lementation of std::tuple, and I hope it gets picked up quickly.

tao::tuple does not trade functionality for speed. It gains its (compilatio=
n) speed by avoiding to instantiate tons of helpers. One source of superflu=
ous instantiations was recursion, and while implementing the alternative I =
realized that there is a second source of superfluous instantiations which =
could only be removed when we don=E2=80=99t rely on make_integer_sequence o=
r tuple_element_t anymore. Removing the first part (recursion) already show=
s how big the impact is. Compiler intrinsics that are used behind the scene=
s might provide some improvements, but this is only half the way. We can do=
 more, we can do better.

Besides the speed up and reduced memory usage for the compiler, there is an=
other benefit for the user: Code becomes much easier to write. Consider the=
 example I gave in the paper:

template<class F, class Tuple, size_t... I>
decltype(auto) apply_impl(F&& f, Tuple&& t, index_sequence<I...>) {
  return forward<F>(f)(get<I>(forward<Tuple>(t))...);
}

template<class F, class Tuple>
decltype(auto) apply(F&& f, Tuple&& t) {
  using Indices =3D make_index_sequence<tuple_size<decay_t<Tuple>>::value>;
  return apply_impl(forward<F>(f), forward<Tuple>(t), Indices());
}

This is already using the existing interface for make_index_sequence. Try e=
xplaining it to a student. Heck, try explaining to *me* why C++ does need t=
o create a type first just to then extract =E2=80=9Csize_t... I=E2=80=9D fr=
om it. ;) Why can=E2=80=99t we do this directly? With the proposed extensio=
n, it becomes:

template<class F, class Tuple>
decltype(auto) apply(F&& f, Tuple&& t) {
  constexpr auto Size =3D tuple_size<decay_t<Tuple>>::value;
  return forward<F>(f)(get<size_t... Size>(forward<Tuple>(t))...);
}

Still complicated, but much easier and without additional instantiations of=
 apply_impl.

For me, that is the difference between something that is possible in C++ an=
d something that is supported by C++. Keep in mind that the std::tuple=E2=
=80=99s were written by some of the (at least IMHO) best C++ developers aro=
und, they are way above average. Yet, it seems that the importance of insta=
ntiating large numbers of helpers was not fully seen/realized. I hope that =
this will change in the future and I think that my proposal would give anot=
her important options to avoid those instantiations.

For the implementation of tao::tuple being picked up by the different STLs:=
 I=E2=80=99d like that and I can only offer it to them - which I already di=
d. FWIW, I also offered to work on it myself for open-source STLs (libstdc+=
+, libc++) or to relicense where/when necessary (MS?). There wasn=E2=80=99t=
 much response, but my offer still stands.

Best regards,
Daniel

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/A73623E9-BB53-4C90-9744-FE17DFB31C4A%40gmx.de.

--Apple-Mail=_986E7DE1-FE2A-429D-8D5F-988D6B05A947
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename=signature.asc
Content-Type: application/pgp-signature;
 name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iEYEARECAAYFAlbXQDcACgkQAUxJbew56yEIwgCgzHIeefI0PpRJSRgAWLb6BlZ8
2lsAnR24WvTwvmPNB8Wh8MzwGjumZqSe
=1Hr7
-----END PGP SIGNATURE-----

--Apple-Mail=_986E7DE1-FE2A-429D-8D5F-988D6B05A947--

.


Author: Daniel Frey <d.frey@gmx.de>
Date: Sat, 5 Mar 2016 13:41:17 +0100
Raw View
--Apple-Mail=_6346E5A2-1071-49E8-B5F0-FA6E11510384
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8

> On 02.03.2016, at 02:50, Arthur O'Dwyer <arthur.j.odwyer@gmail.com> wrote=
:
>=20
> Portable, standardized syntax for std::make_integer_sequence already exis=
ts; it's std::make_integer_sequence!

Just one more remark about this: The improvements on libc++ for std::tuple =
vs. tao::tuple are *not* because of make_integer_sequence. In fact, tao::ma=
ke_integer_sequence is *slower* than the (incredibly smart) implementation =
of std::make_integer_sequence found in libc++. The improvements are caused =
by avoiding instantiations in lots of places (some/most of them using make_=
integer_sequence). I believe there is no one point where you can fix it by =
=E2=80=9Cjust=E2=80=9D improving make_integer_sequence and/or tuple_element=
_t, hence the language needs to support it directly.

> > MacOS, Apple LLVM 7.0 (Clang ~3.7), std::tuple: 70.0s, MID 514
> > MacOS, Apple LLVM 7.0 (Clang ~3.7), tao::tuple:  1.7s, MID 15

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/C2C7781D-E5A5-4051-AC0D-FD14F24F233F%40gmx.de.

--Apple-Mail=_6346E5A2-1071-49E8-B5F0-FA6E11510384
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename=signature.asc
Content-Type: application/pgp-signature;
 name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iEYEARECAAYFAlba0+0ACgkQAUxJbew56yF4LwCfaZYIaRyWCwbx8DO+Jxij0auE
QeUAoLOYCiy0GKdMOMiOENxaFGPWpUx2
=k+bl
-----END PGP SIGNATURE-----

--Apple-Mail=_6346E5A2-1071-49E8-B5F0-FA6E11510384--

.


Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Sun, 6 Mar 2016 10:55:04 -0800
Raw View
--047d7b163515defad7052d65e281
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

On Wed, Mar 2, 2016 at 11:34 AM, Daniel Frey <d.frey@gmx.de> wrote:
> On 02.03.2016, at 02:50, Arthur O'Dwyer <arthur.j.odwyer@gmail.com> wrote=
:
> > On Tue, Mar 1, 2016 at 1:27 PM, Daniel Frey <d.frey@gmx.de> wrote:
> > > On 29.02.2016, at 06:36, Arthur O'Dwyer <arthur.j.odwyer@gmail.com>
wrote:
> > > > On Sunday, February 28, 2016 at 1:32:56 PM UTC-8, Daniel Frey wrote=
:
> > > > > I=E2=80=99d like to propose three basic functionalities wrt param=
eter
packs.
> > > > >
> > > > > 1) Allow expansion of only a single element via pattern...[I].
> > > > > 2) Allow in-situ creation of unexpanded non-type parameter packs
via Type... N.
> > > > > 3) Allow aliases via using Is =3D std::size_t... 5.
[...]
> > >
> > > - More expressiveness as an unexpanded parameter pack is generated,
not just
> > > an instance of a class (std::integer_sequence)
> > > - Portable, standardized syntax
> >
> > In the part of my post that you snipped, I indicated that "generating
an unexpanded
> > parameter pack" is a liability, not an advantage. You seemed to agree
("Good catch
> > ... I'll reconsider that one ...").  Maybe I should say is currently a
liability. It would be
> > awesome to have first-class parameter packs, but I think there are deep
problems
> > someone needs to solve before we can get them.
>
> When I said =E2=80=9CGood catch=E2=80=9D I meant that you spotted a probl=
em that I
haven=E2=80=99t realized
> before. It=E2=80=99s an interesting problem and, of course, it makes me
reconsider given that
> you, IIUC, raised it in the context of my proposed language addition 3).

It also applies to addition (2), because that also turns a non-pack
expression into a (first-class) parameter pack.
I do think addition (1) is immune from this particular problem, but I
believe addition (1) is 100% equivalent to syntactic sugar for
std::get<I>(std::forward_as_tuple(pattern...)).

Section 5.2 of the original "Variadic Templates" proposal, N1603, deals
with the idea of pattern.[I] being syntactic sugar for
std::get<I>(std::forward_as_tuple(pattern...)), and apparently the original
authors didn't think it would be useful. Obviously this may have changed in
the 12 years since 2004.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1603.pdf

What if C++1z were to add a single "unwrapped" version of std::get,
something like this?

template<size_t Idx, typename... T>
inline __attribute__((__visibility__("hidden"), always_inline))
decltype(auto) getp(T&&... t) {
    return std::get<Idx>(std::forward_as_tuple(t...));
}

That is, getp would be to std::get as std::experimental::invoke is to
std::experimental::apply.
The library vendor would be free to optimize the internal implementation of
getp so that it could be constant-time instead of logarithmic (or worse) in
the value of Idx.
Would this solve your problem (1) without a core language change?  That is,
if you could take your existing hypothetical code using params...[I] and
rewrite it to use std::getp<I>(params...), would that be acceptable?
(I can confirm that just because a call to std::getp<I> appears in the
source code for a TU does not mean that the compiler is forced to generate
out-of-line code for std::getp<I>, because empirically Clang *does* not
generate it. The above gives perfect codegen at -O3. I can definitely
believe that it doesn't give perfect performance in terms of *compile time*=
,
but I think that would be just a QoI issue, solvable by the vendor in
whatever way they found most appropriate.)

[...]
> Heck, try explaining to *me* why C++ does need to create a type first
just to then extract =E2=80=9Csize_t... I=E2=80=9D from it. ;)
> Why can=E2=80=99t we do this directly? With the proposed extension, it be=
comes:
>
> template<class F, class Tuple>
> decltype(auto) apply(F&& f, Tuple&& t) {
>   constexpr auto Size =3D tuple_size<decay_t<Tuple>>::value;
>   return forward<F>(f)(get<size_t... Size>(forward<Tuple>(t))...);
> }

Because the above version involves creating a pack from a non-pack (in the
"expression" size_t... Size). Once you allow that, you have to explain what
would happen with

template<size_t I>
auto foo() { return bar<size_t... I ...>(); }

template<size_t... Is>
auto bar() { return baz<size_t... Is ... ...>(); }

and so on. Either you have to devote a *lot* of thought and wording to
explaining the semantics of naked parameter-packs, or you have to make sure
that every pack is always wrapped up in a type where it can't escape and
wreak havoc.

=E2=80=93Arthur

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/CADvuK0K8TjzYoBysGRDk4VQjHzYO3uts8d4NFpFLokwmnvb=
zMw%40mail.gmail.com.

--047d7b163515defad7052d65e281
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">On Wed, Mar 2, 2016 at 11:34 AM, Daniel Frey &lt;<a href=
=3D"mailto:d.frey@gmx.de">d.frey@gmx.de</a>&gt; wrote:<br>&gt; On 02.03.201=
6, at 02:50, Arthur O&#39;Dwyer &lt;<a href=3D"mailto:arthur.j.odwyer@gmail=
..com">arthur.j.odwyer@gmail.com</a>&gt; wrote:<br>&gt; &gt; On Tue, Mar 1, =
2016 at 1:27 PM, Daniel Frey &lt;<a href=3D"mailto:d.frey@gmx.de">d.frey@gm=
x.de</a>&gt; wrote:<br>&gt; &gt; &gt; On 29.02.2016, at 06:36, Arthur O&#39=
;Dwyer &lt;<a href=3D"mailto:arthur.j.odwyer@gmail.com">arthur.j.odwyer@gma=
il.com</a>&gt; wrote:<br>&gt; &gt; &gt; &gt; On Sunday, February 28, 2016 a=
t 1:32:56 PM UTC-8, Daniel Frey wrote:<br>&gt; &gt; &gt; &gt; &gt; I=E2=80=
=99d like to propose three basic functionalities wrt parameter packs.<br>&g=
t; &gt; &gt; &gt; &gt;<br>&gt; &gt; &gt; &gt; &gt; 1) Allow expansion of on=
ly a single element via pattern...[I].<br>&gt; &gt; &gt; &gt; &gt; 2) Allow=
 in-situ creation of unexpanded non-type parameter packs via Type... N.<br>=
&gt; &gt; &gt; &gt; &gt; 3) Allow aliases via using Is =3D std::size_t... 5=
..<br>[...]<br>&gt; &gt; &gt;<br>&gt; &gt; &gt; - More expressiveness as an =
unexpanded parameter pack is generated, not just<div>&gt; &gt; &gt; an inst=
ance of a class (std::integer_sequence)<br>&gt; &gt; &gt; - Portable, stand=
ardized syntax<br>&gt; &gt;<br>&gt; &gt; In the part of my post that you sn=
ipped, I indicated that &quot;generating an unexpanded<br>&gt; &gt; paramet=
er pack&quot; is a liability, not an advantage. You seemed to agree (&quot;=
Good catch<br>&gt; &gt; ... I&#39;ll reconsider that one ...&quot;).=C2=A0 =
Maybe I should say is currently a liability. It would be<br>&gt; &gt; aweso=
me to have first-class parameter packs, but I think there are deep problems=
<br>&gt; &gt; someone needs to solve before we can get them.<br>&gt;<br>&gt=
; When I said =E2=80=9CGood catch=E2=80=9D I meant that you spotted a probl=
em that I haven=E2=80=99t realized<br>&gt; before. It=E2=80=99s an interest=
ing problem and, of course, it makes me reconsider given that<br>&gt; you, =
IIUC, raised it in the context of my proposed language addition 3).<br><br>=
It also applies to addition (2), because that also turns a non-pack express=
ion into a (first-class) parameter pack.<br>I do think addition (1) is immu=
ne from this particular problem, but I believe addition (1) is 100% equival=
ent to syntactic sugar for <font face=3D"monospace, monospace">std::get&lt;=
I&gt;(std::forward_as_tuple(pattern...))</font>.<br><br>Section 5.2 of the =
original &quot;Variadic Templates&quot; proposal, N1603, deals with the ide=
a of <font face=3D"monospace, monospace">pattern.[I]</font> being syntactic=
 sugar for <font face=3D"monospace, monospace">std::get&lt;I&gt;(std::forwa=
rd_as_tuple(pattern...))</font>, and apparently the original authors didn&#=
39;t think it would be useful. Obviously this may have changed in the 12 ye=
ars since 2004.<br><a href=3D"http://www.open-std.org/jtc1/sc22/wg21/docs/p=
apers/2004/n1603.pdf">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/20=
04/n1603.pdf</a><div><br></div><div>What if C++1z were to add a single &quo=
t;unwrapped&quot; version of std::get, something like this?</div><div><br><=
/div><div><font face=3D"monospace, monospace">template&lt;size_t Idx, typen=
ame... T&gt;</font></div><div><font face=3D"monospace, monospace">inline __=
attribute__((__visibility__(&quot;hidden&quot;), always_inline))</font></di=
v><div><span style=3D"font-family:monospace,monospace">decltype(auto) getp(=
T&amp;&amp;... t) {</span><br></div><div><font face=3D"monospace, monospace=
">=C2=A0 =C2=A0 return std::get&lt;Idx&gt;(std::forward_as_tuple(t...));</f=
ont></div><div><font face=3D"monospace, monospace">}</font></div><div><br><=
/div><div>That is, <font face=3D"monospace, monospace">getp</font> would be=
 to <font face=3D"monospace, monospace">std::get</font> as <font face=3D"mo=
nospace, monospace">std::experimental::invoke</font> is to <font face=3D"mo=
nospace, monospace">std::experimental::apply</font>.</div><div>The library =
vendor would be free to optimize the internal implementation of <font face=
=3D"monospace, monospace">getp</font> so that it could be constant-time ins=
tead of logarithmic (or worse) in the value of=C2=A0<font face=3D"monospace=
, monospace">Idx</font>.</div><div>Would this solve your problem (1) withou=
t a core language change?=C2=A0 That is, if you could take your existing hy=
pothetical code using <font face=3D"monospace, monospace">params...[I]</fon=
t> and rewrite it to use <font face=3D"monospace, monospace">std::getp&lt;I=
&gt;(params...)</font>, would that be acceptable?</div><div>(I can confirm =
that just because a call to=C2=A0<font face=3D"monospace, monospace">std::g=
etp&lt;I&gt;</font> appears in the source code for a TU does not mean that =
the compiler is forced to generate out-of-line code for <font face=3D"monos=
pace, monospace">std::getp&lt;I&gt;</font>, because empirically Clang <i>do=
es</i> not generate it. The above gives perfect codegen at -O3. I can defin=
itely believe that it doesn&#39;t give perfect performance in terms of=C2=
=A0<i>compile time</i>, but I think that would be just a QoI issue, solvabl=
e by the vendor in whatever way they found most appropriate.)</div><div><br=
></div><div>[...]</div><div>&gt; Heck, try explaining to *me* why C++ does =
need to create a type first just to then extract =E2=80=9Csize_t... I=E2=80=
=9D from it. ;)</div><div>&gt; Why can=E2=80=99t we do this directly? With =
the proposed extension, it becomes:<br></div><div>&gt;<br>&gt; template&lt;=
class F, class Tuple&gt;<br>&gt; decltype(auto) apply(F&amp;&amp; f, Tuple&=
amp;&amp; t) {<br>&gt; =C2=A0 constexpr auto Size =3D tuple_size&lt;decay_t=
&lt;Tuple&gt;&gt;::value;<br>&gt; =C2=A0 return forward&lt;F&gt;(f)(get&lt;=
size_t... Size&gt;(forward&lt;Tuple&gt;(t))...);<br>&gt; }</div><div><br></=
div><div>Because the above version involves creating a pack from a non-pack=
 (in the &quot;expression&quot;=C2=A0<font face=3D"monospace, monospace">si=
ze_t... Size</font>). Once you allow that, you have to explain what would h=
appen with</div><div><br></div><div><font face=3D"monospace, monospace">tem=
plate&lt;size_t I&gt;</font></div><div><font face=3D"monospace, monospace">=
auto foo() { return bar&lt;size_t... I ...&gt;(); }</font></div><div><br></=
div><div><div><font face=3D"monospace, monospace">template&lt;size_t... Is&=
gt;</font></div><div><font face=3D"monospace, monospace">auto bar() { retur=
n baz&lt;size_t... Is ... ...&gt;(); }</font></div></div><div><font face=3D=
"monospace, monospace"><br></font></div><div>and so on. Either you have to =
devote a <i>lot</i> of thought and wording to explaining the semantics of n=
aked parameter-packs, or you have to make sure that every pack is always wr=
apped up in a type where it can&#39;t escape and wreak havoc.</div><div><br=
></div><div>=E2=80=93Arthur</div></div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CADvuK0K8TjzYoBysGRDk4VQjHzYO3uts8d4N=
FpFLokwmnvbzMw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">htt=
ps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0K8TjzYoBys=
GRDk4VQjHzYO3uts8d4NFpFLokwmnvbzMw%40mail.gmail.com</a>.<br />

--047d7b163515defad7052d65e281--

.


Author: Matthew Woehlke <mwoehlke.floss@gmail.com>
Date: Mon, 07 Mar 2016 10:53:17 -0500
Raw View
On 2016-02-28 16:32, Daniel Frey wrote:
> I=E2=80=99d like to propose three basic functionalities wrt parameter pac=
ks.
>=20
> 1) Allow expansion of only a single element via pattern...[I].

I want to put in a strong vote for `[I]pack` instead. This is consistent
with my proposals for `[I]tuple` (which in fact I extended to `[I]pack`
already).

> 2) Allow in-situ creation of unexpanded non-type parameter packs via Type=
.... N.

I think you need to talk to Mike Spertus regarding this one. He has a
proposal for parameter pack literals that is very similar and possibly
should incorporate this. At least, it would be best if the two of you
are aware of each other's work.

> 3) Allow aliases via using Is =3D std::size_t... 5.

Mike *might* already be covering this case, also.

--=20
Matthew

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/nbk85i%24cvg%241%40ger.gmane.org.

.


Author: Daniel Frey <d.frey@gmx.de>
Date: Wed, 9 Mar 2016 23:15:56 +0100
Raw View
--Apple-Mail=_9A8C48E7-10C1-4D83-A70A-EEAC52920637
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8

> On 06.03.2016, at 19:55, Arthur O'Dwyer <arthur.j.odwyer@gmail.com> wrote=
:

FWIW, I think I now have a much better understanding about the problem you =
raised about (2) and (3), I=E2=80=99ll address that in a separate reply whe=
n I had enough time to think about it. In this reply I=E2=80=99ll only addr=
ess everything wrt proposal (1), the single expansion via pattern...[I]

> I do think addition (1) is immune from this particular problem, but I bel=
ieve addition (1) is 100% equivalent to syntactic sugar for std::get<I>(std=
::forward_as_tuple(pattern...)).

Not quite, as it doesn=E2=80=99t work for type-packs, only for value-packs.=
 For value-packs, since C++14 both std::get as well as std::forward_as_tupl=
e are constexpr so that is also covered. It=E2=80=99s still a lot to write =
compared to pattern...[I] and it feels very indirect. It also internally wi=
ll most likely have to go through the type-pack case.

Also, my proposal should not be limited to provide pack expansion only in t=
he existing places where you=E2=80=99d have a parameter list. Since I=E2=80=
=99m only expanding a single pattern, it might just be a single call to a f=
unction or a single value. For example:

int i =3D Ns...[I];

which would simply pick the I-th element from the Ns. A single selection al=
ways returns a single type, a single value, or a single statement. It could=
 be used in much more contexts as normal parameter pack expansion:

    print(Ns*2+1)...[I];

which would be a call to print(N*2+1); where N is the I-th element of the p=
arameter pack Ns.

Anyways, for types, you=E2=80=99d need std::tuple_element_t<std::tuple<patt=
ern...>>. Certainly possible, but still inefficient. Internally, it could b=
enefit from something like:

    template< std::size_t I, typename... Ts >
    using type_by_index_t =3D typename type_by_index< I, Ts... >::type;

(an implementation of type_by_index is available at https://github.com/taoc=
pp/sequences/blob/master/include/tao/seq/type_by_index.hpp)

In fact, I used type_by_index to implement tao::tuple=E2=80=99s =E2=80=9Ctu=
ple_element_t" as well as =E2=80=9Cget<I>". A compiler vendor might provide=
 some compiler intrinsic with much better efficiency, but I still think tha=
t the additional steps required for values will justify (1). For values, th=
e interface I was using is:

    template< std::size_t I, typename T, T... Ns >
    struct select
      : std::integral_constant< T, values< T, Ns... >::data[ I ] >
    {};

    template< std::size_t I, typename T, T... Ns >
    struct select< I, integer_sequence< T, Ns... > >
      : select< I, T, Ns... >
    {};

with

    template< typename T, T... Ns >
    struct values
    {
      static constexpr T data[] =3D { Ns... };
    };

While this is not too bad from an implementation=E2=80=99s point of view, i=
t is still very indirect and you=E2=80=99d either have to have an index_seq=
uence S already to call

    select<I, S>

or you need to provide the type:

    select<I, T, Vs...> // Vs are values of integral type T

> Section 5.2 of the original "Variadic Templates" proposal, N1603, deals w=
ith the idea of pattern.[I] being syntactic sugar for std::get<I>(std::forw=
ard_as_tuple(pattern...)), and apparently the original authors didn't think=
 it would be useful. Obviously this may have changed in the 12 years since =
2004.

IMHO my work on tao::tuple vs. std::tuple shows the potential. tao::tuple o=
nly uses better implementations using existing language features, but it al=
so made me aware of the additional places where inefficiencies are only avo=
idable by adding some primitives wrt variadic templates to the language.

> What if C++1z were to add a single "unwrapped" version of std::get, somet=
hing like this?
>=20
> template<size_t Idx, typename... T>
> inline __attribute__((__visibility__("hidden"), always_inline))
> decltype(auto) getp(T&&... t) {
>     return std::get<Idx>(std::forward_as_tuple(t...));
> }
>=20
> That is, getp would be to std::get as std::experimental::invoke is to std=
::experimental::apply.
> The library vendor would be free to optimize the internal implementation =
of getp so that it could be constant-time instead of logarithmic (or worse)=
 in the value of Idx.
> Would this solve your problem (1) without a core language change?  That i=
s, if you could take your existing hypothetical code using params...[I] and=
 rewrite it to use std::getp<I>(params...), would that be acceptable?
> (I can confirm that just because a call to std::getp<I> appears in the so=
urce code for a TU does not mean that the compiler is forced to generate ou=
t-of-line code for std::getp<I>, because empirically Clang does not generat=
e it. The above gives perfect codegen at -O3. I can definitely believe that=
 it doesn't give perfect performance in terms of compile time, but I think =
that would be just a QoI issue, solvable by the vendor in whatever way they=
 found most appropriate.)

Make =E2=80=9Cgetp=E2=80=9D constexpr, but yes, that=E2=80=99s another vers=
ion of the above select, where your usage is somehow easier: =E2=80=9Cstd::=
getp<I>(vs...)=E2=80=9D. This could work, together with =E2=80=9Cstd::type_=
by_index_t<I, Ts...>=E2=80=9D. Still both interfaces are quite different an=
d we certainly need better names :)

FWIW, there was http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n37=
61.html which used std::type_at and std::value_at.

But for the user (1) is certainly more convenient plus is would allow addit=
ional use cases like the print-example I gave above. To quote from N4492:

> Bad (committee) habits to avoid, to avoid giving critics more ammunition:
> =E2=80=A2 Make something a library because that's easier to get accepted =
in the committee than a language feature (even if there is good argument th=
at what is provided is fundamental)

I=E2=80=99d like to explore which primitives are missing wrt variadic templ=
ates and parameter packs. (1) seems like such a basic thing and it is usefu=
l in many places, that I=E2=80=99d really like to see it as part of the lan=
guage. We=E2=80=99ll see about (2) and (3)=E2=80=A6 :)

@MatthewWoehlke: Thanks for the hint. I am aware of N4235 from Daveed Vande=
voorde (also making a good case for (1) and (2)), haven=E2=80=99t contacted=
 Mike Spertus yet. I might do so when I make some more progress with (2) an=
d (3) and the other issue raised by Arthur or he might join the discussion =
here if he wants to. The syntax for (1) seems to be a concern, so far patte=
rn...[I], pattern.[I] and your [I]pattern are the options. But it=E2=80=99s=
 pointless to discuss when it=E2=80=99s not clear yet if the functionality =
is actually wanted in the language, let=E2=80=99s wait that out first.

-- Daniel

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/2A7BC498-01DD-4249-8633-4078DF2819B1%40gmx.de.

--Apple-Mail=_9A8C48E7-10C1-4D83-A70A-EEAC52920637
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename=signature.asc
Content-Type: application/pgp-signature;
 name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iEYEARECAAYFAlbgoJwACgkQAUxJbew56yHs6wCeLIm3bKTndKqwL8bW9RXzqSWo
LrEAnjwjrMStF7NjF9lShGQHlU5YVmU0
=aLag
-----END PGP SIGNATURE-----

--Apple-Mail=_9A8C48E7-10C1-4D83-A70A-EEAC52920637--

.


Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Wed, 9 Mar 2016 16:05:36 -0800
Raw View
--001a113d5d26f788b7052da692d9
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

On Wed, Mar 9, 2016 at 2:15 PM, Daniel Frey <d.frey@gmx.de> wrote:

> On 06.03.2016, at 19:55, Arthur O'Dwyer <arthur.j.odwyer@gmail.com> wrote=
:
> > I do think addition (1) is immune from this particular problem, but I
> believe addition (1) is 100% equivalent to syntactic sugar for
> std::get<I>(std::forward_as_tuple(pattern...)).
>
> Not quite, as it doesn=E2=80=99t work for type-packs, only for value-pack=
s. For
> value-packs, since C++14 both std::get as well as std::forward_as_tuple a=
re
> constexpr so that is also covered. It=E2=80=99s still a lot to write comp=
ared to
> pattern...[I] and it feels very indirect. It also internally will most
> likely have to go through the type-pack case.
>

My thinking was that you could get the type via
decltype(std::get<I>(std::forward_as_tuple(pattern...))),
or if you had a type-pack already,
decltype(std::get<I>(std::forward_as_tuple(std::declval<pattern>()...))).
I admit this has problems with type-packs containing void, though, so
there's room for improvement in the library. (See below.)

You wrote:

>     print(Ns*2+1)...[I];
>

Is the above equivalent to
    print((Ns...[I])*2+1);
? (Maybe the former has some SFINAE implications, I guess, but basically
yes?)  I'm not really seeing why I'd want to use your example instead of
the latter. Can you come up with another example that shows why you might
want to put the ...[I] after the whole pattern, instead of right after the
pack?
I added the "redundant" inner parentheses because I think otherwise we run
into grammatical ambiguities again, due to the fact that ... syntactically
doesn't behave like a postfix operator but more like a comma. (You'll find
posts in here from two months ago where I claimed ... *does* act basically
like a postfix operator. My views have evolved. :))



> > What if C++1z were to add a single "unwrapped" version of std::get,
> something like this?
> >
> > template<size_t Idx, typename... T>
> > inline __attribute__((__visibility__("hidden"), always_inline))
> > decltype(auto) getp(T&&... t) {
> >     return std::get<Idx>(std::forward_as_tuple(t...));
> > }
> >
> > That is, getp would be to std::get as std::experimental::invoke is to
> std::experimental::apply.
> > The library vendor would be free to optimize the internal implementatio=
n
> of getp so that it could be constant-time instead of logarithmic (or wors=
e)
> in the value of Idx.
> > Would this solve your problem (1) without a core language change?  That
> is, if you could take your existing hypothetical code using params...[I]
> and rewrite it to use std::getp<I>(params...), would that be acceptable?
> > (I can confirm that just because a call to std::getp<I> appears in the
> source code for a TU does not mean that the compiler is forced to generat=
e
> out-of-line code for std::getp<I>, because empirically Clang does not
> generate it. The above gives perfect codegen at -O3. I can definitely
> believe that it doesn't give perfect performance in terms of compile time=
,
> but I think that would be just a QoI issue, solvable by the vendor in
> whatever way they found most appropriate.)
>
> Make =E2=80=9Cgetp=E2=80=9D constexpr, but yes, that=E2=80=99s another ve=
rsion of the above
> select, where your usage is somehow easier: =E2=80=9Cstd::getp<I>(vs...)=
=E2=80=9D. This
> could work, together with =E2=80=9Cstd::type_by_index_t<I, Ts...>=E2=80=
=9D. Still both
> interfaces are quite different and we certainly need better names :)
>
> FWIW, there was
> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3761.html which
> used std::type_at and std::value_at.
>

I wasn't aware of that paper.  I'd be in favor of that!  If I understand
correctly, Sean's std::value_at<I>(Vs...) is what I just called
std::getp<I>(Vs...) and what you call Vs...[I]. Sean's std::type_at<I,
Ts...>::type is what you call Ts...[I], and what I'd have to call some
monstrosity like decltype(std::getp<I>(std::declval<Ts>()...)) and *still*
wouldn't handle void correctly.

Notice that in C++14land, N3761's std::type_at<I, Ts...>::type would
normally be used as std::type_at_t<I, Ts...>.

=E2=80=93Arthur

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/CADvuK0LS-qx8XHVKuy8zOFCcyNHgQ9JbYwp1S%3DL8i0jQb=
JYXDQ%40mail.gmail.com.

--001a113d5d26f788b7052da692d9
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">On Wed, Mar 9, 2016 at 2:15 PM, Daniel Frey <span dir=3D"l=
tr">&lt;<a href=3D"mailto:d.frey@gmx.de" target=3D"_blank">d.frey@gmx.de</a=
>&gt;</span> wrote:<br><div class=3D"gmail_extra"><div class=3D"gmail_quote=
"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;borde=
r-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid=
;padding-left:1ex">On 06.03.2016, at 19:55, Arthur O&#39;Dwyer &lt;<a href=
=3D"mailto:arthur.j.odwyer@gmail.com">arthur.j.odwyer@gmail.com</a>&gt; wro=
te:<br><span class=3D"">&gt; I do think addition (1) is immune from this pa=
rticular problem, but I believe addition (1) is 100% equivalent to syntacti=
c sugar for std::get&lt;I&gt;(std::forward_as_tuple(pattern...)).<br>
<br>
</span>Not quite, as it doesn=E2=80=99t work for type-packs, only for value=
-packs. For value-packs, since C++14 both std::get as well as std::forward_=
as_tuple are constexpr so that is also covered. It=E2=80=99s still a lot to=
 write compared to pattern...[I] and it feels very indirect. It also intern=
ally will most likely have to go through the type-pack case.<br></blockquot=
e><div><br></div><div>My thinking was that you could get the type via <font=
 face=3D"monospace, monospace">decltype(std::get&lt;I&gt;(std::forward_as_t=
uple(pattern...)))</font>,</div><div>or if you had a type-pack already, <fo=
nt face=3D"monospace, monospace">decltype(std::get&lt;I&gt;(std::forward_as=
_tuple(std::declval&lt;pattern&gt;()...)))</font>.</div><div>I admit this h=
as problems with type-packs containing=C2=A0<font face=3D"monospace, monosp=
ace">void</font>, though, so there&#39;s room for improvement in the librar=
y. (See below.)</div><div><br></div><div>You wrote:=C2=A0</div><blockquote =
class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1=
px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:=
1ex"><font face=3D"monospace, monospace">=C2=A0 =C2=A0 print(Ns*2+1)...[I];=
</font><br></blockquote><div><br></div><div>Is the above equivalent to</div=
><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 print((Ns...[I])*2+=
1);</font></div><div>? (Maybe the former has some SFINAE implications, I gu=
ess, but basically yes?) =C2=A0I&#39;m not really seeing why I&#39;d want t=
o use your example instead of the latter. Can you come up with another exam=
ple that shows why you might want to put the <font face=3D"monospace, monos=
pace">...[I]</font> after the whole pattern, instead of right after the pac=
k?</div><div>I added the &quot;redundant&quot; inner parentheses because I =
think otherwise we run into grammatical ambiguities again, due to the fact =
that <font face=3D"monospace, monospace">...</font> syntactically doesn&#39=
;t behave like a postfix operator but more like a comma. (You&#39;ll find p=
osts in here from two months ago where I claimed <font face=3D"monospace, m=
onospace">...</font> <i>does</i> act basically like a postfix operator. My =
views have evolved. :))</div><div><br></div><div>=C2=A0<br></div><blockquot=
e class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width=
:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-lef=
t:1ex"><span class=3D"">&gt; What if C++1z were to add a single &quot;unwra=
pped&quot; version of std::get, something like this?<br>
&gt;<br>
&gt; template&lt;size_t Idx, typename... T&gt;<br>
&gt; inline __attribute__((__visibility__(&quot;hidden&quot;), always_inlin=
e))<br>
&gt; decltype(auto) getp(T&amp;&amp;... t) {<br>
&gt;=C2=A0 =C2=A0 =C2=A0return std::get&lt;Idx&gt;(std::forward_as_tuple(t.=
...));<br>
&gt; }<br>
&gt;<br>
&gt; That is, getp would be to std::get as std::experimental::invoke is to =
std::experimental::apply.<br>
&gt; The library vendor would be free to optimize the internal implementati=
on of getp so that it could be constant-time instead of logarithmic (or wor=
se) in the value of Idx.<br>
&gt; Would this solve your problem (1) without a core language change?=C2=
=A0 That is, if you could take your existing hypothetical code using params=
....[I] and rewrite it to use std::getp&lt;I&gt;(params...), would that be a=
cceptable?<br>
&gt; (I can confirm that just because a call to std::getp&lt;I&gt; appears =
in the source code for a TU does not mean that the compiler is forced to ge=
nerate out-of-line code for std::getp&lt;I&gt;, because empirically Clang d=
oes not generate it. The above gives perfect codegen at -O3. I can definite=
ly believe that it doesn&#39;t give perfect performance in terms of compile=
 time, but I think that would be just a QoI issue, solvable by the vendor i=
n whatever way they found most appropriate.)<br>
<br>
</span>Make =E2=80=9Cgetp=E2=80=9D constexpr, but yes, that=E2=80=99s anoth=
er version of the above select, where your usage is somehow easier: =E2=80=
=9Cstd::getp&lt;I&gt;(vs...)=E2=80=9D. This could work, together with =E2=
=80=9Cstd::type_by_index_t&lt;I, Ts...&gt;=E2=80=9D. Still both interfaces =
are quite different and we certainly need better names :)<br>
<br>
FWIW, there was <a href=3D"http://www.open-std.org/jtc1/sc22/wg21/docs/pape=
rs/2013/n3761.html" rel=3D"noreferrer" target=3D"_blank">http://www.open-st=
d.org/jtc1/sc22/wg21/docs/papers/2013/n3761.html</a> which used std::type_a=
t and std::value_at.<br></blockquote><div><br></div><div>I wasn&#39;t aware=
 of that paper.=C2=A0 I&#39;d be in favor of that!=C2=A0 If I understand co=
rrectly, Sean&#39;s=C2=A0<font face=3D"monospace, monospace">std::value_at&=
lt;I&gt;(Vs...)</font> is what I just called <font face=3D"monospace, monos=
pace">std::getp&lt;I&gt;(Vs...)</font> and what you call <font face=3D"mono=
space, monospace">Vs...[I]</font>. Sean&#39;s <font face=3D"monospace, mono=
space">std::type_at&lt;I, Ts...&gt;::type</font>=C2=A0is what you call <fon=
t face=3D"monospace, monospace">Ts...[I]</font>, and what I&#39;d have to c=
all some monstrosity like <font face=3D"monospace, monospace">decltype(std:=
:getp&lt;I&gt;(std::declval&lt;Ts&gt;()...))</font> and <i>still</i> wouldn=
&#39;t handle void correctly.</div><div><br></div><div>Notice that in C++14=
land, N3761&#39;s=C2=A0<span style=3D"font-family:monospace,monospace">std:=
:type_at&lt;I, Ts...&gt;::type</span>=C2=A0would normally be used as=C2=A0<=
span style=3D"font-family:monospace,monospace">std::type_at_t&lt;I, Ts...&g=
t;</span>.</div><div><br></div><div>=E2=80=93Arthur</div></div></div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CADvuK0LS-qx8XHVKuy8zOFCcyNHgQ9JbYwp1=
S%3DL8i0jQbJYXDQ%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0LS-qx8XH=
VKuy8zOFCcyNHgQ9JbYwp1S%3DL8i0jQbJYXDQ%40mail.gmail.com</a>.<br />

--001a113d5d26f788b7052da692d9--

.


Author: barry.revzin@gmail.com
Date: Wed, 9 Mar 2016 16:42:41 -0800 (PST)
Raw View
------=_Part_40_952091443.1457570561853
Content-Type: multipart/alternative;
 boundary="----=_Part_41_250720336.1457570561853"

------=_Part_41_250720336.1457570561853
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

I am a fan of simply allowing pattern...[I], but the rest of the proposal=
=20
strikes me as maybe wanting to solve the wrong problem? It does make=20
writing something like apply easier, but it'd be even easier if I could=20
just do:

    template <class F, class Tuple>
    decltype(auto) apply(F&& f, Tuple&& tuple) {
        return forward<F>(f)(forward<Tuple>(tuple)...);
    }

I'm not sure what rules you'd have to create in order to allow for the=20
direct unpacking of tuple, but I think that's what we're going to want to=
=20
do to improve pack fundamentals. Unpacking the tuple just makes sense. All=
=20
the other std::get<> and index_sequence stuff is a workaround for not being=
=20
able to do that.=20

My $0.01,

Barry

On Sunday, February 28, 2016 at 3:32:56 PM UTC-6, Daniel Frey wrote:
>
> I=E2=80=99d like to propose three basic functionalities wrt parameter pac=
ks.
>
> 1) Allow expansion of only a single element via pattern...[I].
> 2) Allow in-situ creation of unexpanded non-type parameter packs via Type=
....=20
> N.
> 3) Allow aliases via using Is =3D std::size_t... 5.
>
> I think that those are the fundamentals missing for efficient=20
> implementation of variadic functions dealing with parameter packs.
>
> I attached a first draft of a formal proposal. Any feedback welcome.
>
> Daniel
>
>

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/fefde0e8-aeb2-4d63-bab5-fe5b232cc6cf%40isocpp.or=
g.

------=_Part_41_250720336.1457570561853
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">I am a fan of simply allowing <font face=3D"courier new, m=
onospace">pattern...[I]</font><font face=3D"arial, sans-serif">, but the re=
st of the proposal strikes me as maybe wanting to solve the wrong problem? =
It does make writing something like </font><font face=3D"courier new, monos=
pace">apply </font><font face=3D"arial, sans-serif">easier, but it&#39;d be=
 even easier if I could just do:</font><div><font face=3D"arial, sans-serif=
"><br></font></div><div><font face=3D"courier new, monospace">=C2=A0 =C2=A0=
 template &lt;class F, class Tuple&gt;</font></div><div><font face=3D"couri=
er new, monospace">=C2=A0 =C2=A0 decltype(auto) apply(F&amp;&amp; f, Tuple&=
amp;&amp; tuple) {</font></div><div><font face=3D"courier new, monospace">=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 return forward&lt;F&gt;(f)(forward&lt;Tuple&gt;=
(tuple)...);</font></div><div><font face=3D"courier new, monospace">=C2=A0 =
=C2=A0 }</font></div><div><font face=3D"courier new, monospace"><br></font>=
</div><div><font face=3D"arial, sans-serif">I&#39;m not sure what rules you=
&#39;d have to create in order to allow for the direct unpacking of tuple, =
but I think that&#39;s what we&#39;re going to want to do to improve pack f=
undamentals. Unpacking the tuple just makes sense. All the other </font><fo=
nt face=3D"courier new, monospace">std::get&lt;&gt;</font><font face=3D"ari=
al, sans-serif">=C2=A0and </font><font face=3D"courier new, monospace">inde=
x_sequence</font><font face=3D"arial, sans-serif">=C2=A0stuff is a workarou=
nd for not being able to do that.=C2=A0</font></div><div><font face=3D"aria=
l, sans-serif"><br></font></div><div><font face=3D"arial, sans-serif">My $0=
..01,</font></div><div><font face=3D"arial, sans-serif"><br></font></div><di=
v><font face=3D"arial, sans-serif">Barry<br></font><br>On Sunday, February =
28, 2016 at 3:32:56 PM UTC-6, Daniel Frey wrote:<blockquote class=3D"gmail_=
quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;pa=
dding-left: 1ex;"><div style=3D"word-wrap:break-word"><font face=3D"Helveti=
ca">I=E2=80=99d like to propose three basic functionalities wrt parameter p=
acks.</font><div><font face=3D"Helvetica"><br></font></div><div>1) Allow ex=
pansion of only a single element via <font face=3D"Courier">pattern...[I]</=
font>.</div><div><div><font face=3D"Helvetica">2) Allow in-situ creation of=
 unexpanded non-type parameter packs via=C2=A0</font><font face=3D"Courier"=
>Type... N</font><font face=3D"Helvetica">.</font></div></div><div><font fa=
ce=3D"Helvetica">3) Allow aliases via </font><font face=3D"Courier">using I=
s =3D std::size_t... 5</font><font face=3D"Helvetica">.</font></div><div><f=
ont face=3D"Helvetica"><br></font></div><div><font face=3D"Helvetica">I thi=
nk that those are the fundamentals missing for efficient implementation of =
variadic functions dealing with parameter packs.</font></div><div><font fac=
e=3D"Helvetica"><br></font></div><div><font face=3D"Helvetica">I attached a=
 first draft of a formal proposal. Any feedback welcome.</font></div><div><=
font face=3D"Helvetica"><br></font></div><div><font face=3D"Helvetica">Dani=
el</font></div><div><font face=3D"Helvetica"><br></font></div><div></div></=
div></blockquote></div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/fefde0e8-aeb2-4d63-bab5-fe5b232cc6cf%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/fefde0e8-aeb2-4d63-bab5-fe5b232cc6cf=
%40isocpp.org</a>.<br />

------=_Part_41_250720336.1457570561853--
------=_Part_40_952091443.1457570561853--

.


Author: Daniel Frey <d.frey@gmx.de>
Date: Sat, 12 Mar 2016 00:28:11 +0100
Raw View
--Apple-Mail=_A4EDF175-0891-4DBF-A61A-5E632FA1B96A
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8

> On 10.03.2016, at 01:05, Arthur O'Dwyer <arthur.j.odwyer@gmail.com> wrote=
:
>=20
> On Wed, Mar 9, 2016 at 2:15 PM, Daniel Frey <d.frey@gmx.de> wrote:
> On 06.03.2016, at 19:55, Arthur O'Dwyer <arthur.j.odwyer@gmail.com> wrote=
:
> > I do think addition (1) is immune from this particular problem, but I b=
elieve addition (1) is 100% equivalent to syntactic sugar for std::get<I>(s=
td::forward_as_tuple(pattern...)).
>=20
> Not quite, as it doesn=E2=80=99t work for type-packs, only for value-pack=
s. For value-packs, since C++14 both std::get as well as std::forward_as_tu=
ple are constexpr so that is also covered. It=E2=80=99s still a lot to writ=
e compared to pattern...[I] and it feels very indirect. It also internally =
will most likely have to go through the type-pack case.
>=20
> My thinking was that you could get the type via decltype(std::get<I>(std:=
:forward_as_tuple(pattern...))),
> or if you had a type-pack already, decltype(std::get<I>(std::forward_as_t=
uple(std::declval<pattern>()...))).
> I admit this has problems with type-packs containing void, though, so the=
re's room for improvement in the library. (See below.)

To make void work, you=E2=80=99d end up with something like:

  unwrap_t<decltype(std::get<I>(std::forward_as_tuple(wrap<pattern>()...)))=
>

Not really what I=E2=80=99d like to write just to get the I-th type. Could =
be hidden behind some other interface (std::type_at_t<I,Ts...>, but I feel =
like using tuple to implement this is the wrong thing to do. tuple needs al=
l those fundamental operations to be implemented, not the other way round.

> You wrote:
>     print(Ns*2+1)...[I];
>=20
> Is the above equivalent to
>     print((Ns...[I])*2+1);

The above example, yes, it=E2=80=99s equivalent. But an expression (pattern=
) to expand may also contain multiple parameter packs (of the same length) =
or the same parameter pack multiple times. Example:

  print(Ns * Ns + Ms)...[I];

or if you don=E2=80=99t allow statements as patterns:

  print((Ns * Ns + Ms)...[I]);

which is much easier than the alternative:

  print(Ns...[I] * Ns...[I] + Ms...[I]);

Also, as pattern..,.[I] is an expression it may contain an unexpanded param=
eter pack in place of I and be used like this:

  print_variadic((Ns * Ns + Ms)...[Is]...);

which, given Is =3D {4, 1, 3} is equivalent to:

  print_variadic(Ns*Ns+Ms...[4], Ns*Ns+Ms...[1], Ns*Ns+Ms...[3]);

> ? (Maybe the former has some SFINAE implications, I guess, but basically =
yes?)  I'm not really seeing why I'd want to use your example instead of th=
e latter. Can you come up with another example that shows why you might wan=
t to put the ...[I] after the whole pattern, instead of right after the pac=
k?

Of course the above could, in theory, be rewritten with only immediate appl=
ication to a parameter pack, not a more complex pattern. Not sure if you ag=
ree that the above example is convincing, but to me it seems that it=E2=80=
=99s worth it.

> I added the "redundant" inner parentheses because I think otherwise we ru=
n into grammatical ambiguities again, due to the fact that ... syntacticall=
y doesn't behave like a postfix operator but more like a comma. (You'll fin=
d posts in here from two months ago where I claimed ... does act basically =
like a postfix operator. My views have evolved. :))

I=E2=80=99ll have to think about those details, but thank you for pointing =
me to all those subtleties. While this part is only about (1), I also now h=
ad an idea how to combine (2) and (3) into a better proposal which should a=
ddress most of the points you raised. I=E2=80=99ll write an answer to that =
at the weekend if I have time.

> > That is, getp would be to std::get as std::experimental::invoke is to s=
td::experimental::apply.
> > The library vendor would be free to optimize the internal implementatio=
n of getp so that it could be constant-time instead of logarithmic (or wors=
e) in the value of Idx.
> > Would this solve your problem (1) without a core language change?  That=
 is, if you could take your existing hypothetical code using params...[I] a=
nd rewrite it to use std::getp<I>(params...), would that be acceptable?
> > (I can confirm that just because a call to std::getp<I> appears in the =
source code for a TU does not mean that the compiler is forced to generate =
out-of-line code for std::getp<I>, because empirically Clang does not gener=
ate it. The above gives perfect codegen at -O3. I can definitely believe th=
at it doesn't give perfect performance in terms of compile time, but I thin=
k that would be just a QoI issue, solvable by the vendor in whatever way th=
ey found most appropriate.)

I=E2=80=99m concerned about either the time it takes to compile this or the=
 complexity the compiler vendor has to put in to optimize this case. I thin=
k it would be actually easier to get better performance and an easier imple=
mentation using a core language change. But mostly it=E2=80=99s the compile=
 time I=E2=80=99m looking at. C++ has a bad reputation for being slow to co=
mpile, I think that variadic templates and how parameter packs are handled =
have a great influence here, encouraging and often requiring an inefficient=
 programming style. Plus it=E2=80=99s currently often quite hard and indire=
ct to express yourself, leading to more bugs. With SFINAE overloads being e=
nabled/disabled when calling some function/method, with noexcept checking p=
arameters for properties, etc. we are using more and more of those =E2=80=
=9Clittle helpers=E2=80=9D behind the scenes, often without noticing them. =
But as little as each single helper or invocation is, it piles up and can m=
ake a huge difference.

> Make =E2=80=9Cgetp=E2=80=9D constexpr, but yes, that=E2=80=99s another ve=
rsion of the above select, where your usage is somehow easier: =E2=80=9Cstd=
::getp<I>(vs...)=E2=80=9D. This could work, together with =E2=80=9Cstd::typ=
e_by_index_t<I, Ts...>=E2=80=9D. Still both interfaces are quite different =
and we certainly need better names :)
>=20
> FWIW, there was http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n=
3761.html which used std::type_at and std::value_at.
>=20
> I wasn't aware of that paper.  I'd be in favor of that!  If I understand =
correctly, Sean's std::value_at<I>(Vs...) is what I just called std::getp<I=
>(Vs...) and what you call Vs...[I]. Sean's std::type_at<I, Ts...>::type is=
 what you call Ts...[I], and what I'd have to call some monstrosity like de=
cltype(std::getp<I>(std::declval<Ts>()...)) and still wouldn't handle void =
correctly.
>=20
> Notice that in C++14land, N3761's std::type_at<I, Ts...>::type would norm=
ally be used as std::type_at_t<I, Ts...>.

Yes, it=E2=80=99s as good as it gets for a library-based interface. You=E2=
=80=99d have std::type_at_t<I, Ts...> and std::value_at<I>(Vs...). Still th=
ere are a few points in favor of ...[I]:

* It=E2=80=99s shorter to write, more direct and consistent (both cases, ty=
pe and value, have the same syntax).
* It=E2=80=99s most likely more efficient wrt compiler resources (time and =
memory), especially when using a more complex pattern. No need for the comp=
iler to expand all the patterns and throw away all-but-one. And throwing aw=
ay does not mean that all memory of the compiler will be freed.
* It could be used to expand a pattern into a single statement, but that is=
 an option I need to think about more deeply.

=E2=80=94 Daniel

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/83DF5FBB-83FA-4D63-A9FA-9265CC0C4AA9%40gmx.de.

--Apple-Mail=_A4EDF175-0891-4DBF-A61A-5E632FA1B96A
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename=signature.asc
Content-Type: application/pgp-signature;
 name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iEYEARECAAYFAlbjVIsACgkQAUxJbew56yENjwCgwHXchHu6bUJF2FRHGmAG/11a
56IAn0r5a2Z/7N5FUAjrQRRF1R0WG86V
=tofy
-----END PGP SIGNATURE-----

--Apple-Mail=_A4EDF175-0891-4DBF-A61A-5E632FA1B96A--

.


Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Fri, 11 Mar 2016 15:50:53 -0800
Raw View
--001a113cdb14fd42ea052dce9919
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

On Fri, Mar 11, 2016 at 3:28 PM, Daniel Frey <d.frey@gmx.de> wrote:
> On 10.03.2016, at 01:05, Arthur O'Dwyer <arthur.j.odwyer@gmail.com> wrote=
:
> >
> > My thinking was that you could get the type via
decltype(std::get<I>(std::forward_as_tuple(pattern...))),
> > or if you had a type-pack already,
decltype(std::get<I>(std::forward_as_tuple(std::declval<pattern>()...))).
> > I admit this has problems with type-packs containing void, though, so
there's room for improvement
> > in the library. (See below.)
>
> To make void work, you=E2=80=99d end up with something like:
>
>
unwrap_t<decltype(std::get<I>(std::forward_as_tuple(wrap<pattern>()...)))>
>
> Not really what I=E2=80=99d like to write just to get the I-th type.

Agreed.

> Could be hidden behind some other interface (std::type_at_t<I,Ts...>, but
I feel like using
> tuple to implement this is the wrong thing to do. tuple needs all those
fundamental operations
> to be implemented, not the other way round.

Once you hide it behind an interface (e.g. std::type_at), you don't have to
implement it using std::tuple anymore; you could implement it using
__builtin_nth_element<> or whatever. And once you hide it behind an
interface and *standardize that interface*, the *vendor* can implement it
using whatever, even including a core language extension (possibly a
non-standard but conforming extension) if a certain compiler happens to
provide it, but falling back on builtins otherwise, and even falling back
on template meta-programming if the compiler is too old for the builtins.

>
> > You wrote:
> >     print(Ns*2+1)...[I];
> >
> > Is the above equivalent to
> >     print((Ns...[I])*2+1);
>
> The above example, yes, it=E2=80=99s equivalent. But an expression (patte=
rn) to
expand may also contain multiple parameter packs (of the same length) or
the same parameter pack multiple times. Example:
>
>   print(Ns * Ns + Ms)...[I];

Ah, right. I'd forgotten about that application.
But then you *really* need to specify what the above would mean for SFINAE.
Let's say (Ns) ...[1] would cause a substitution failure; does (Ns * Ns)
....[0] still compile? What about (Ns * Ns) ...[2]?

> Also, as pattern..,.[I] is an expression it may contain an unexpanded
parameter pack in place of I and be used like this:
>   print_variadic((Ns * Ns + Ms)...[Is]...);
> which, given Is =3D {4, 1, 3} is equivalent to:
>   print_variadic(Ns*Ns+Ms...[4], Ns*Ns+Ms...[1], Ns*Ns+Ms...[3]);

FYI, despite the "nested" ...s, I have not found anything troublesome about
that example yet. It might be okay. ;)

=E2=80=93Arthur

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/CADvuK0L6TZK2D82A94XHPMCJO_CcPPeOBKXQbh0%2BH_qHK=
_cTpg%40mail.gmail.com.

--001a113cdb14fd42ea052dce9919
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">On Fri, Mar 11, 2016 at 3:28 PM, Daniel Frey &lt;<a href=
=3D"mailto:d.frey@gmx.de">d.frey@gmx.de</a>&gt; wrote:<br>&gt; On 10.03.201=
6, at 01:05, Arthur O&#39;Dwyer &lt;<a href=3D"mailto:arthur.j.odwyer@gmail=
..com">arthur.j.odwyer@gmail.com</a>&gt; wrote:<br>&gt; &gt;<br>&gt; &gt; My=
 thinking was that you could get the type via decltype(std::get&lt;I&gt;(st=
d::forward_as_tuple(pattern...))),<br>&gt; &gt; or if you had a type-pack a=
lready, decltype(std::get&lt;I&gt;(std::forward_as_tuple(std::declval&lt;pa=
ttern&gt;()...))).<br>&gt; &gt; I admit this has problems with type-packs c=
ontaining void, though, so there&#39;s room for improvement<div>&gt; &gt; i=
n the library. (See below.)<br>&gt;<br>&gt; To make void work, you=E2=80=99=
d end up with something like:<br>&gt;<br>&gt; =C2=A0 unwrap_t&lt;decltype(s=
td::get&lt;I&gt;(std::forward_as_tuple(wrap&lt;pattern&gt;()...)))&gt;<br>&=
gt;<br>&gt; Not really what I=E2=80=99d like to write just to get the I-th =
type.</div><div><br></div><div>Agreed.</div><div><br></div><div>&gt; Could =
be hidden behind some other interface (std::type_at_t&lt;I,Ts...&gt;, but I=
 feel like using</div><div>&gt; tuple to implement this is the wrong thing =
to do. tuple needs all those fundamental operations</div><div>&gt; to be im=
plemented, not the other way round.</div><div><br></div><div>Once you hide =
it behind an interface (e.g. <font face=3D"monospace, monospace">std::type_=
at</font>), you don&#39;t have to implement it using <font face=3D"monospac=
e, monospace">std::tuple</font> anymore; you could implement it using <font=
 face=3D"monospace, monospace">__builtin_nth_element&lt;&gt;</font> or what=
ever. And once you hide it behind an interface and <i>standardize that inte=
rface</i>, the <i>vendor</i> can implement it using whatever, even includin=
g a core language extension (possibly a non-standard but conforming extensi=
on) if a certain compiler happens to provide it, but falling back on builti=
ns otherwise, and even falling back on template meta-programming if the com=
piler is too old for the builtins.</div><div><br></div><div>&gt;<br>&gt; &g=
t; You wrote:<br>&gt; &gt; =C2=A0 =C2=A0 print(Ns*2+1)...[I];<br>&gt; &gt;<=
br>&gt; &gt; Is the above equivalent to<br>&gt; &gt; =C2=A0 =C2=A0 print((N=
s...[I])*2+1);<br>&gt;<br>&gt; The above example, yes, it=E2=80=99s equival=
ent. But an expression (pattern) to expand may also contain multiple parame=
ter packs (of the same length) or the same parameter pack multiple times. E=
xample:<br>&gt;<br>&gt; =C2=A0 print(Ns * Ns + Ms)...[I];</div><div><br></d=
iv><div>Ah, right. I&#39;d forgotten about that application.</div><div>But =
then you <i>really</i> need to specify what the above would mean for SFINAE=
.. Let&#39;s say <font face=3D"monospace, monospace">(Ns) ...[1]</font> woul=
d cause a substitution failure; does <font face=3D"monospace, monospace">(N=
s * Ns) ...[0]</font> still compile? What about <font face=3D"monospace, mo=
nospace">(Ns * Ns) ...[2]</font>?</div><div><br></div><div>&gt; Also, as pa=
ttern..,.[I] is an expression it may contain an unexpanded parameter pack i=
n place of I and be used like this:<br>&gt; =C2=A0 print_variadic((Ns * Ns =
+ Ms)...[Is]...);<br>&gt; which, given Is =3D {4, 1, 3} is equivalent to:<b=
r>&gt; =C2=A0 print_variadic(Ns*Ns+Ms...[4], Ns*Ns+Ms...[1], Ns*Ns+Ms...[3]=
);</div><div><br></div><div>FYI, despite the &quot;nested&quot; <font face=
=3D"monospace, monospace">...</font>s, I have not found anything troublesom=
e about that example yet. It might be okay. ;)</div><div><br></div><div>=E2=
=80=93Arthur</div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CADvuK0L6TZK2D82A94XHPMCJO_CcPPeOBKXQ=
bh0%2BH_qHK_cTpg%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0L6TZK2D8=
2A94XHPMCJO_CcPPeOBKXQbh0%2BH_qHK_cTpg%40mail.gmail.com</a>.<br />

--001a113cdb14fd42ea052dce9919--

.


Author: Daniel Frey <d.frey@gmx.de>
Date: Sat, 12 Mar 2016 01:19:15 +0100
Raw View
> On 12.03.2016, at 00:50, Arthur O'Dwyer <arthur.j.odwyer@gmail.com> wrote=
:
>=20
> On Fri, Mar 11, 2016 at 3:28 PM, Daniel Frey <d.frey@gmx.de> wrote:
> > On 10.03.2016, at 01:05, Arthur O'Dwyer <arthur.j.odwyer@gmail.com> wro=
te:
> > >
> > > My thinking was that you could get the type via decltype(std::get<I>(=
std::forward_as_tuple(pattern...))),
> > > or if you had a type-pack already, decltype(std::get<I>(std::forward_=
as_tuple(std::declval<pattern>()...))).
> > > I admit this has problems with type-packs containing void, though, so=
 there's room for improvement
> > > in the library. (See below.)
> >
> > To make void work, you=E2=80=99d end up with something like:
> >
> >   unwrap_t<decltype(std::get<I>(std::forward_as_tuple(wrap<pattern>()..=
..)))>
> >
> > Not really what I=E2=80=99d like to write just to get the I-th type.
>=20
> Agreed.
>=20
> > Could be hidden behind some other interface (std::type_at_t<I,Ts...>, b=
ut I feel like using
> > tuple to implement this is the wrong thing to do. tuple needs all those=
 fundamental operations
> > to be implemented, not the other way round.
>=20
> Once you hide it behind an interface (e.g. std::type_at), you don't have =
to implement it using std::tuple anymore; you could implement it using __bu=
iltin_nth_element<> or whatever. And once you hide it behind an interface a=
nd standardize that interface, the vendor can implement it using whatever, =
even including a core language extension (possibly a non-standard but confo=
rming extension) if a certain compiler happens to provide it, but falling b=
ack on builtins otherwise, and even falling back on template meta-programmi=
ng if the compiler is too old for the builtins.

Yes, but the compiler would still expand all expressions (pattern), then pa=
ss them to std::type_at_t (or std::value_at) and only then the compiler int=
rinsic will be able to optimize - too late IMHO. Unless the compiler would =
treat std::type_at_t and std::value_at as the intrinsic, giving it a specia=
l treatment.

> > > You wrote:
> > >     print(Ns*2+1)...[I];
> > >
> > > Is the above equivalent to
> > >     print((Ns...[I])*2+1);
> >
> > The above example, yes, it=E2=80=99s equivalent. But an expression (pat=
tern) to expand may also contain multiple parameter packs (of the same leng=
th) or the same parameter pack multiple times. Example:
> >
> >   print(Ns * Ns + Ms)...[I];
>=20
> Ah, right. I'd forgotten about that application.
> But then you really need to specify what the above would mean for SFINAE.=
 Let's say (Ns) ...[1] would cause a substitution failure; does (Ns * Ns) .=
...[0] still compile? What about (Ns * Ns) ...[2]?

I think that this is actually another benefit of having ...[I] over a libra=
ry-based interface. For the library interface, all expansions must be valid=
 - the pack selection would only require the selected expansion to be valid=
 (and participate in SFINAE). Let=E2=80=99s say I identified all indices fr=
om a pack that could be printed. Those are indices 0, 1, 3, 4 and 7. Having=
 Is =3D {0,1,3,4,7} would allow for

  print<Ns*Ns+Ms>()...[Is]...;

without triggering an invalid instantiation of print (I=E2=80=99m using pri=
nt<N>() because now there could be some SFINAE going on allowing only speci=
fic values for N).

An open question for the above would be the order of evaluation. Sequential=
, i.e., sequence points between each expression? Or unspecified? Hm. Sequen=
tial when ending with semicolon, unspecified when ending in a sequence of c=
omma and semicolon? Eeek :(

In theory there is also the question of multiple parameter packs in the pat=
tern of different length. As long as the expansion does not exceed the smal=
lest parameter pack, would that be OK? Technically it shouldn=E2=80=99t be =
too difficult, but I=E2=80=99d be concerned that it might lead to more bugs=
 and it will probably not be needed very often. For now, I think the length=
 of the parameter packs should be forced to be equal.

> > Also, as pattern..,.[I] is an expression it may contain an unexpanded p=
arameter pack in place of I and be used like this:
> >   print_variadic((Ns * Ns + Ms)...[Is]...);
> > which, given Is =3D {4, 1, 3} is equivalent to:
> >   print_variadic(Ns*Ns+Ms...[4], Ns*Ns+Ms...[1], Ns*Ns+Ms...[3]);
>=20
> FYI, despite the "nested" ...s, I have not found anything troublesome abo=
ut that example yet. It might be okay. ;)

That=E2=80=99s a very good sign, thanks :)

=E2=80=94 Daniel

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/BDB82A7F-269E-48A3-A975-742AA86B9BC7%40gmx.de.

.


Author: Daniel Frey <d.frey@gmx.de>
Date: Sun, 13 Mar 2016 13:44:27 +0100
Raw View
--Apple-Mail=_74AE534F-95E1-4109-BD80-FEE365E9A2F6
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8

> On 06.03.2016, at 19:55, Arthur O'Dwyer <arthur.j.odwyer@gmail.com> wrote=
:
>=20
> > > In the part of my post that you snipped, I indicated that "generating=
 an unexpanded
> > > parameter pack" is a liability, not an advantage. You seemed to agree=
 ("Good catch
> > > ... I'll reconsider that one ...").  Maybe I should say is currently =
a liability. It would be
> > > awesome to have first-class parameter packs, but I think there are de=
ep problems
> > > someone needs to solve before we can get them.
> >
> > When I said =E2=80=9CGood catch=E2=80=9D I meant that you spotted a pro=
blem that I haven=E2=80=99t realized
> > before. It=E2=80=99s an interesting problem and, of course, it makes me=
 reconsider given that
> > you, IIUC, raised it in the context of my proposed language addition 3)=
..
>=20
> It also applies to addition (2), because that also turns a non-pack expre=
ssion into a (first-class) parameter pack.

I think I now have a solution for the problem you spotted with (2) and (3),=
 the new proposal (attached) solves this by not allowing in-situ creation o=
r in-situ access to member packs. In short, I only propose two new features=
 now:

(1) Pack selection:

  pattern...[I]

(2) Pack declaration:

  typename... Ts; // empty pack
  typename... Ts =3D int, void, double&&;
  using typename... Ts =3D my_class<int>::types; // access pack member, thi=
s can not be templated
  std::size_t... Vs; // empty pack
  std::size_t... Vs =3D 3, 0, 1, 42;
  using std::size_t... Vs =3D my_class<int>::values;
  std::size_t... Vs =3D ... 4; // yields 0, 1, 2, 3

I'll improve the proposal with better examples, rationale, etc. later on, b=
ut I'd like to get some feedback if you (and others) agree that the above a=
voids the problems that the previous proposal had and in general if the syn=
tax and the feature are the right fundamentals to write easier and better c=
ode.

-- Daniel


--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/5EC00360-0582-4BEC-BC43-0768B1704096%40gmx.de.

--Apple-Mail=_74AE534F-95E1-4109-BD80-FEE365E9A2F6
Content-Disposition: inline;
 filename="Improve Variadic Templates.pdf"
Content-Type: application/pdf;
 x-unix-mode=0644;
 name="Improve Variadic Templates.pdf"
Content-Transfer-Encoding: base64

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
Ry6z2m/zMYKpBIYbHTJP+h0x2xdYdKLH/N64rvWrBVdO+oDfapb+HNxCoS89/Pdix7/uUPOe+4JD
qcr9VsXwyk82fJXLHUhOf4H28+QLs25xGBKNS1jDX/f1Xn8DCs0cYc71nf4lh2qjS8pU32xsXHWt
VAov8T/VcQFOURZjUbOI4hHJ11AXGUS20MU4hqcIJj6Mx1JYMI/vEW3g3mge9IaWtlwy3NpsKh9J
dLEG76ap4PMtxDcW8doGcQnZ6UMTCo9/I+Dz0NfdNvBFqq/ozaw8SbdGGBPsnQAfJBLwNb378RKm
/0RcJb/u0QPL0kRDqhgrNFxSeeAd3v6c6j7EBYAz6IxcFiFnh2jVwhoK6l6ulEMes3U/LuOG8BXv
0DJ1rO8ydSTJkgTDgUpygcEI6QGjAQKoBw/c9yVDbknfOoES6KvhqUchCX2n+BywYvZbK3gHpGxR
OaQlAVOE4UZVWjDG3kZCVSoiwYY7lL4sC2BEKvmdbV1plMQwl6tRBBQKLVvGjb6ik9tSEjWY4qTP
cXv6S4s6IPbfI3bvb0VAW1mMPdKeCEAFWariHE8eGUxNhO00SS5v8D554h9FOy6Gp3zHfj5IIGQh
6ahl4kASwehVxnhy8JAukJPfrRvuGsffrdvk1YqLx/jnM8K3ROznS6IcqkjkZz1kxFlKHwKFEFjy
WxoXf+xJZ1RZWiGkP26lauJyhfWxaruJXY0IBHFkI9GIV9JogoYaZBHLKEIXkkRT+bTIA3slC8nI
MdGpZn766O5ufMaAOCl6KZL6EiEqUyySpmmZeIWybfDgF+7bHf0Pl3Vds8ubXdlVu/U2b7ty1TR1
Xq/GP5/WX4aP2bta+eFuVL3ZtewF+5cuXRnr/4xfADEi4wKAdjCEhOV+1yVajMcT6RV5Jmqqsul2
jf0UQuffzCx+MfVN1M5131VN05s7KJ7IS67++58Uu//Bk/+L/wPIlG71CmVuZHN0cmVhbQplbmRv
YmoKNSAwIG9iago0Mjk2CmVuZG9iagoyIDAgb2JqCjw8IC9UeXBlIC9QYWdlIC9QYXJlbnQgMyAw
IFIgL1Jlc291cmNlcyA2IDAgUiAvQ29udGVudHMgNCAwIFIgL01lZGlhQm94IFswIDAgNTk1LjI4
IDg0MS44OV0KPj4KZW5kb2JqCjYgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERGIC9UZXh0IF0gL0Nv
bG9yU3BhY2UgPDwgL0NzMSA3IDAgUiAvQ3MyIDkgMCBSID4+IC9Gb250IDw8Ci9UVDQgMTIgMCBS
IC9UVDIgMTAgMCBSIC9UVDEgOCAwIFIgL1RUNSAxMyAwIFIgL1RUMyAxMSAwIFIgPj4gPj4KZW5k
b2JqCjE0IDAgb2JqCjw8IC9MZW5ndGggMTUgMCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdC
IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AZ2Wd1RT2RaHz703vdASIiAl9Bp6CSDS
O0gVBFGJSYBQAoaEJnZEBUYUESlWZFTAAUeHImNFFAuDgmLXCfIQUMbBUURF5d2MawnvrTXz3pr9
x1nf2ee319ln733XugBQ/IIEwnRYAYA0oVgU7uvBXBITy8T3AhgQAQ5YAcDhZmYER/hEAtT8vT2Z
mahIxrP27i6AZLvbLL9QJnPW/3+RIjdDJAYACkXVNjx+JhflApRTs8UZMv8EyvSVKTKGMTIWoQmi
rCLjxK9s9qfmK7vJmJcm5KEaWc4ZvDSejLtQ3pol4aOMBKFcmCXgZ6N8B2W9VEmaAOX3KNPT+JxM
ADAUmV/M5yahbIkyRRQZ7onyAgAIlMQ5vHIOi/k5aJ4AeKZn5IoEiUliphHXmGnl6Mhm+vGzU/li
MSuUw03hiHhMz/S0DI4wF4Cvb5ZFASVZbZloke2tHO3tWdbmaPm/2d8eflP9Pch6+1XxJuzPnkGM
nlnfbOysL70WAPYkWpsds76VVQC0bQZA5eGsT+8gAPIFALTenPMehmxeksTiDCcLi+zsbHMBn2su
K+g3+5+Cb8q/hjn3mcvu+1Y7phc/gSNJFTNlReWmp6ZLRMzMDA6Xz2T99xD/48A5ac3Jwyycn8AX
8YXoVVHolAmEiWi7hTyBWJAuZAqEf9Xhfxg2JwcZfp1rFGh1XwB9hTlQuEkHyG89AEMjAyRuP3oC
fetbEDEKyL68aK2Rr3OPMnr+5/ofC1yKbuFMQSJT5vYMj2RyJaIsGaPfhGzBAhKQB3SgCjSBLjAC
LGANHIAzcAPeIACEgEgQA5YDLkgCaUAEskE+2AAKQTHYAXaDanAA1IF60AROgjZwBlwEV8ANcAsM
gEdACobBSzAB3oFpCILwEBWiQaqQFqQPmULWEBtaCHlDQVA4FAPFQ4mQEJJA+dAmqBgqg6qhQ1A9
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
Kf6295XRq59+d/u9Z2LJxPBr0euZP0reqL45+tb2bedk6OTTd2nvpqeK3qu+P/aB/aH7Y/THkens
T/hPlZ+NP3d8CfzyeCZtZubf94Tz+wplbmRzdHJlYW0KZW5kb2JqCjE1IDAgb2JqCjI2MTIKZW5k
b2JqCjcgMCBvYmoKWyAvSUNDQmFzZWQgMTQgMCBSIF0KZW5kb2JqCjE2IDAgb2JqCjw8IC9MZW5n
dGggMTcgMCBSIC9OIDEgL0FsdGVybmF0ZSAvRGV2aWNlR3JheSAvRmlsdGVyIC9GbGF0ZURlY29k
ZSA+PgpzdHJlYW0KeAGlVwdYk9caPv9IwkrYU0bYyDKg7BmZAWQPQVRiEkgYIQaCgLgoxQrWLQ4c
FS2KUrRaESgu1OKgblDruFBLBaUWq7iwes8JoND2ufc+z83/HP73fGd86z3ffwBAXciVSLJxAECO
OF8aEstOnpmcwqTdAwpAF6gCR6DK5eVJ2NHREXAKEOeKBeg98feyC2BIcsMB7TVx7L/2KHxBHg/O
OgVbET+PlwMA5g0ArY8nkeYDoGgB5eYL8iUIh0KslRUfGwBxKgAKKqNroRiYhAjEAqmIxwyRcouY
IdycHC7T2dGZGS3NTRdl/4PVaNH/88vJliG70c8ENpW8rLhw+HaE9pfxuYEIu0N8mMcNihvFjwtE
iZEQ+wOAm0nyp8dCHAbxPFlWAhtie4jr06XBCRD7QnxbKAtFeBoAhE6xMD4JYmOIw8TzIqMg9oRY
yMsLSIHYBuIaoYCD8gRjRlwU5XPiIYb6iKfS3Fg03xYA0psvCAwakZPpWbnhyAYzKP8uryAOyeU2
FwsDkJ1QF9mVyQ2LhtgK4heC7BA0H+5DMZDkR6M9YZ8SKM6ORHr9Ia4S5Mn9hX1KV74wHuXMGQCq
Wb40Hq2FtlHj00XBHIiDIS4USkORHPpLPSHJlvMMxoT6TiqLRb5DH2nBAnECiiHixVKuNCgEYhgr
WitIxLhAAHLBPPiXB8SgBzBBHhCBAjnKAFyQAxsTWmAPWwicJYZNCmfkgSwoz4C49+M46qMVaI0E
juSCdDgzG64bkzIBH64fWYf2yIUN9dC+ffJ9eaP6HKG+AOOvgQyOC8EAHBdCNAN0yyWF0L4c2A+A
Uhkcy4B4vBZnyCNnEC23dcQGNI609I9qyYUr+HJdI+uQlyO2BUCbxaAYjiHb5J6TuiSLnAqbFxlB
+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
eENgVgLAahAoi9smYUEeFIZGlC7G3LEbljlILP0TagS0byvGho0jdWjjNTSlh7zq3Q7PxjCHg3Wz
21Ec9m66wb0m/dcgL4Mj9AYwCRURdQjXCJjoiwehongipLGQRxiPcEbi8Ik0AiLL4tugICYDOHk1
F3C2JlW9Lxv0qg0fdx3XIWH1JEn7AJvVBBzWkt0ByEnrdaI6WW1iI5qdGWJP49MVuoe+EPFAo9EP
ZGryIImhlj1qZzvtZnthR28o0E0788woJr/Qtv7/vB1way5XspU1HP+Z7sF1/aNX2D+THMTk9hSR
pZg4w9+QcxGfUseuOzKHQ/B/Mlwgyog42SBwLTNyU4uriH4hPSyvQ0XI5BQreMU4t3uxRe+tkzxy
yjMOpl0MkmfPWqDDd3QkYoO3oRmIg5NkHOG1ZRSfzlrPpDRI9K1jakG54kZw2FeFd6r661idYfSt
Y0cpyB0ulLArDLFkD12aOFJH2g1jCpRInDZlPGy6fxqKc9yhDEcQvXRh6xRyJ3l6ciI3w2hHl1FM
o+PxgjtIdDVCbqIICGz2Wf3GGagXrW+tjvRCfcJFZLc4SUWcD0YvTRgvkFZ4ZiWy72XR/LxnVkKH
Wq0rnaEK23J1xsc8y4SqaZTAO4DtjvriPtoER/U1EbAhk8Gbm3lR27NFGLGw19VFLJRd/vqPT07T
BQ7N1HiE3DVLm/ywOBiVf2MySdLsXAYkTb04ikTSV/3h1tvrKgO1HRN4+4oUc01TvcYp4NzvJO+w
JexzqN0MCDdnbVWlgUJ1ar3gyZagLHuwxVKcLjXC5sswzDTR16nRHyO0ydElNXXoXL0knOeyZvAo
eB8FBmR5kqptAJFGo1eV1czGr5em8MaNuh3uEmUNR3BMUKtsDi+P6g/9IonFcfvy6B3mNlq1YHMn
iowfZDxgngAfQBtkXvfe0MshRSsY+YvTizAc3umRpPhEnvUjLkM4LI/h8PP/Ac6NSHQKZW5kc3Ry
ZWFtCmVuZG9iagoyMCAwIG9iagozMzc4CmVuZG9iagoxOCAwIG9iago8PCAvVHlwZSAvUGFnZSAv
UGFyZW50IDMgMCBSIC9SZXNvdXJjZXMgMjEgMCBSIC9Db250ZW50cyAxOSAwIFIgL01lZGlhQm94
ClswIDAgNTk1LjI4IDg0MS44OV0gPj4KZW5kb2JqCjIxIDAgb2JqCjw8IC9Qcm9jU2V0IFsgL1BE
RiAvVGV4dCBdIC9Db2xvclNwYWNlIDw8IC9DczEgNyAwIFIgL0NzMiA5IDAgUiA+PiAvRm9udCA8
PAovVFQ3IDIzIDAgUiAvVFQxIDggMCBSIC9UVDUgMTMgMCBSIC9UVDYgMjIgMCBSIC9UVDMgMTEg
MCBSIC9UVDIgMTAgMCBSID4+Cj4+CmVuZG9iagoyNSAwIG9iago8PCAvTGVuZ3RoIDI2IDAgUiAv
RmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGtm0uP28gRx+/8FJ0bBxhz+RD12DgGskEO
zsGIEQF7iBeLiXa89tqataWx40mQj5lrPkuKZP9/RfGhkYPAh6G7q6v+9ezqJvUxvAwfQ27/6k2d
leuwXhTZehMOt+H7cBe++cOxCLtjKNp/x53RrRdltlyFvS1Y6j/vm/8kT/KsKjebelmE90Z48t83
4XUrqS6zYlNuylAv7WFVhMUmN3mLMqwqmyrq0kQnfdENtjyY6I+GoXksQr0Kq9Uq7Pbhu23IszzP
i7DdhSLOd3+2+/DNdrtKbOp1SO9v9x/e39zfXoXtL+GP2xbLJDtnYlDX+bremMiOVxV5PX2UyRSm
epMt8o1ZrmGXNNBMkxbaw4fbu5v949CmuBZFmZXFugp5EkFGrmF7HbbhxbMwB3ZZnzdg5CeUx/vD
p939/8Ss2mTLfLmoxxj3N+9uf3x7d3/78+3hx+Ptx0+3dzsbMFfNwq6rDnYyZY0mPE7N8M9ZRgsL
7F4AJTMBVMmeYZtlWXgefhfs74vfzvItN0mf71xgOt85m5YbA5jMRHhRZWVeFmbTqLD89On49u7n
eZZnsC2WxnJlCSiWQLy3CDW9h456+tws8cwskUznVHFZikrMv/qcrPCUTeGZyPxcgdumsSrUdJlY
bqozGnu4yHqPlAlnd65MxIiZKxPG5EwIn5SJtoJdViYc2lRieJkY5MdjZWK5Lr7KgOfC7zyvqrJC
XlddfWwUV1yEySph8TgTd8tlkziPbw3wb1M5GW8K5xnNZmCTLW09n06L81yXyywv8tVikIRJOm2F
tlY+tVL/4tm33zaC+3VpPoeWdR29ekkOVYtoz2JtsGwD7v50hbYMRWK72F9D+peHq2bPL0N6d2W7
sv29v9HIl6vwQ9j+qdt5z+Aq86/Alau+eDJ6RlvHEnFtI5o3AmM7bYfTHN/iPD4Y4m7Idrh2yJF3
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
RKFEQWwDcxG+vOxjDmonPIVafx003o6Osze0rGIOGzKFMXnA9vC2E0Z0AsvgSCxCzYgMQtjFRdbl
QHztBUPbb3fLl506LqQaOF0x4VCJxVVEMlKZkhmjp3v3aAQBKouv1jzgHfiKZHx0H3F51WtC/RMd
gOEN4v+J5EKj7TOk3olP3P/jc1idmrB3/4bSyMDPUk05bt3EhNoxsZWIWiToJFR/6Q+JPhM83QWm
zyej85/DsK4+himoR7GIz7xGMEScimXvsyNpIs1QAMdKR8ztde568BkN1tUacWeCkIW9SMap6O8S
ID4+gZMAaz0TnWxvAdg2nIvWUOLQGgMz8jUbLdsPpQaZhygrSbGjhzlSh3bDzcBh5JNigo0NC+Bv
+Gb9ij1/nKmq9eUfrVblI58QxZfIvyfleZD9/ZM71EKJ/ygh7ePbGGbMjRUcx5VHqaQpMMbJ6rSK
KiT4lNiAgp1SM+jHateBOZb/Y+hTD1mPGmgYGmuKlzGiLmsZAJCgsoaZYeiBEzVFASa/FiUGxZ+k
g83I+iIV27FbROE+4H2aNAS+HKc1j3PFI3TSGIW6QK5ifqawwrXv9E1XNPH1fVXMfV10+rbOb2+0
cfa6AOAiePa1FxQywi6bK9SoLLuhKDPUsjjS6yXwslYzABu7XVhVzbu5rF+Cml/qLTbLrK6rTbAf
VdXFxr5eXNRZXlVlsE/nBz/am7pQyfNuua0qVxv7TVb8gKv51Y992d/96X6f5peqfwbY2JGmxGRb
OxSkMxyCqiKr6o1dBekSt44/dPnN5K+XjHxTVFWjbgt8xK/Bf3IbnNrNqH6Y9PK/NrtCKAplbmRz
dHJlYW0KZW5kb2JqCjI2IDAgb2JqCjMxNTcKZW5kb2JqCjI0IDAgb2JqCjw8IC9UeXBlIC9QYWdl
IC9QYXJlbnQgMyAwIFIgL1Jlc291cmNlcyAyNyAwIFIgL0NvbnRlbnRzIDI1IDAgUiAvTWVkaWFC
b3gKWzAgMCA1OTUuMjggODQxLjg5XSA+PgplbmRvYmoKMjcgMCBvYmoKPDwgL1Byb2NTZXQgWyAv
UERGIC9UZXh0IF0gL0NvbG9yU3BhY2UgPDwgL0NzMSA3IDAgUiAvQ3MyIDkgMCBSID4+IC9Gb250
IDw8Ci9UVDEgOCAwIFIgL1RUNSAxMyAwIFIgL1RUMiAxMCAwIFIgL1RUMyAxMSAwIFIgL1RUNyAy
MyAwIFIgPj4gPj4KZW5kb2JqCjMgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9NZWRpYUJveCBbMCAw
IDU5NS4yOCA4NDEuODldIC9Db3VudCAzIC9LaWRzIFsgMiAwIFIgMTggMCBSCjI0IDAgUiBdID4+
CmVuZG9iagoyOCAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvUGFnZXMgMyAwIFIgPj4KZW5kb2Jq
CjggMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9CYXNlRm9udCAvR1NU
TVBJK0hlbHZldGljYSAvRm9udERlc2NyaXB0b3IKMjkgMCBSIC9FbmNvZGluZyAvTWFjUm9tYW5F
bmNvZGluZyAvRmlyc3RDaGFyIDMyIC9MYXN0Q2hhciAyMjIgL1dpZHRocyBbIDI3OAowIDM1NSAw
IDAgMCAwIDAgMzMzIDMzMyAwIDU4NCAyNzggMzMzIDI3OCAwIDU1NiA1NTYgNTU2IDU1NiA1NTYg
NTU2IDU1NiAwCjAgMCAyNzggMCA1ODQgMCA1ODQgNTU2IDEwMTUgNjY3IDY2NyA3MjIgNzIyIDY2
NyA2MTEgNzc4IDAgMjc4IDAgMCA1NTYgODMzCjcyMiAwIDY2NyAwIDcyMiA2NjcgNjExIDAgMCA5
NDQgMCAwIDAgMCAwIDAgMCAwIDAgNTU2IDU1NiA1MDAgNTU2IDU1NiAyNzgKNTU2IDU1NiAyMjIg
MjIyIDUwMCAyMjIgODMzIDU1NiA1NTYgNTU2IDU1NiAzMzMgNTAwIDI3OCA1NTYgNTAwIDcyMiA1
MDAgNTAwCjUwMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAzNTAgMCAwIDAgMCAwIDAgMCAw
IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDEw
MDAgMCAwIDAgMCAwIDAgMCAwIDMzMyAzMzMgMCAyMjIgMCAwIDAgMCAwIDAgMCAwIDUwMCBdID4+
CmVuZG9iagoyOSAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0ZvbnROYW1lIC9HU1RN
UEkrSGVsdmV0aWNhIC9GbGFncyAzMiAvRm9udEJCb3ggWy05NTEgLTQ4MSAxNDQ1IDExMjJdCi9J
dGFsaWNBbmdsZSAwIC9Bc2NlbnQgNzcwIC9EZXNjZW50IC0yMzAgL0NhcEhlaWdodCA3MTcgL1N0
ZW1WIDk4IC9YSGVpZ2h0CjUyMyAvU3RlbUggODUgL0F2Z1dpZHRoIDQ0MSAvTWF4V2lkdGggMTUw
MCAvRm9udEZpbGUyIDMwIDAgUiA+PgplbmRvYmoKMzAgMCBvYmoKPDwgL0xlbmd0aCAzMSAwIFIg
L0xlbmd0aDEgMjEwMzYgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBvVx5fFXFvZ85
+z1335fcNTd3S8i+k0AuIRtLkEUgQYIBwirIHpYKjQoEEHFBFsENF1Y1IUQIUCy1IKC2glVQRFsr
WtrX1L4+pBa4J+835yYR0vfep3/083LzmzNzzrlzfvOb3/zm9/vOnLt44ZJpSI2aEI1GTpg8fzqS
/4afQoidOXXu5PnxsvEsQnjr1MbF3niZDSNEz5k+f8bceFl4BiHRNWPO8u7vm/+MUJ4wc9rkhvh1
dBuOeTPhRLyMc+CYNHPu4mXxsqEd6jfNmTe1+7q5Hs5vnDt5Wffz0RUoex+cPHda/P7hL8Exaf68
RYvj5WHX4fj6/IXTuu/HNcDfhwjD2XL0NFKgBxCPKKSDTx1C/DXRhRi4Sq7D35CBV9z3a4u/R3pB
Lt9f/YR8vHDvr578YdrtkPIp4R9wQtFzPzlyESmCkArD9U7lU71X5O9BUt6BxqR0oCFAJUC5QCkp
g2yoCe9GTwK9BESjWfgxtBxoPdCzQExvbh+UjuLH2hghegwvRw48NKpkPPea7B6bqPR81IG59hc8
n9m+Po7t0HtfYXubGikGifgl/CJqQB78GgrgFagKhfGOQ5E5nnq4tA/NB2oCouUU431t7izP27gf
CjAYvhNEbgYf9vwhM9XzTWYHhds874Q6GDj8wg2lqNZz0vWC5+euGZ63gQ7EL+2PwB2HPftcczyb
3R14R5vnaVcHhu88FT8sccFXD3vmRrZ6GjLl68O3dlAH2jyFcH1cVOnJK/B5cl1XPemhDgFDOdU1
3JOc+StPEnwRbvNCpYGo3uN0bfb0h0tuV3moP9BxvB/vRMl4Z1tgqOcYZKG5h4ZECrZ24J8cqgpn
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
MyAwIG9iago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9YTUFK
VkkrSGVsdmV0aWNhIC9Gb250RGVzY3JpcHRvcgozMiAwIFIgL1RvVW5pY29kZSAzMyAwIFIgL0Zp
cnN0Q2hhciAzMyAvTGFzdENoYXIgMzMgL1dpZHRocyBbIDAgXSA+PgplbmRvYmoKMzMgMCBvYmoK
PDwgL0xlbmd0aCAzNCAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBXZDBbsMg
DIbvPIWP3aEi6RkhTZ0q5bB2WtYHIOBESAsghxzy9jMs7aQh+cD/+zM/lufurQs+g/ygaHvMMPrg
CJe4kkUYcPJBtCdw3ub9VjU7myQkw/22ZJy7MEZQSgDIT0aWTBscXl0c8KVoN3JIPkxwuJ/7qvRr
St84Y8jQCK3B4cjj3k26mhlBVvTYOfZ93o5M/XV8bQmBEzHR/kay0eGSjEUyYUKhmkary0ULDO6f
tQPDuHeeWq1KNXxq/8MpaPniM5JdiThN3UMNWgL4gM9VpZjKg7V+AG2acBAKZW5kc3RyZWFtCmVu
ZG9iagozNCAwIG9iagoyMjMKZW5kb2JqCjMyIDAgb2JqCjw8IC9UeXBlIC9Gb250RGVzY3JpcHRv
ciAvRm9udE5hbWUgL1hNQUpWSStIZWx2ZXRpY2EgL0ZsYWdzIDQgL0ZvbnRCQm94IFstOTUxIC00
ODEgMTQ0NSAxMTIyXQovSXRhbGljQW5nbGUgMCAvQXNjZW50IDc3MCAvRGVzY2VudCAtMjMwIC9D
YXBIZWlnaHQgNzE3IC9TdGVtViA5OCAvWEhlaWdodAo1MjMgL1N0ZW1IIDg1IC9BdmdXaWR0aCA0
NDEgL01heFdpZHRoIDE1MDAgL0ZvbnRGaWxlMiAzNSAwIFIgPj4KZW5kb2JqCjM1IDAgb2JqCjw8
IC9MZW5ndGggMzYgMCBSIC9MZW5ndGgxIDUwNjAgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3Ry
ZWFtCngBvVh7cFTVHf6d+9jdPKhJANkkLPduL0veQlApEEo2yW7ICwwE6C6C7CbZmMREMhhSwYHu
WLCyIFURquCo9GEFilw2DL2BSiOjo06rgo5WLTNKfXU6MvZFR0Vz+527yUoYZfIH4z1z7u95zvnO
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
MCBSIC9FbmNvZGluZyAvTWFjUm9tYW5FbmNvZGluZyAvRmlyc3RDaGFyIDMyIC9MYXN0Q2hhcgoy
MDkgL1dpZHRocyBbIDYwMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA2MDAgNjAwIDAgMCAwIDAg
MCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCA2MDAgMCA2MDAgMCA2MDAgMCA2MDAg
MCA2MDAgMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCAwIDYwMCA2MDAgNjAwIDYwMAowIDAgMCA2
MDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
MCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
MCAwIDAgNjAwIF0gPj4KZW5kb2JqCjM3IDAgb2JqCjw8IC9UeXBlIC9Gb250RGVzY3JpcHRvciAv
Rm9udE5hbWUgL1lYUUNWUitDb3VyaWVyTmV3UFMtSXRhbGljTVQgL0ZsYWdzIDk3Ci9Gb250QkJv
eCBbLTEyNCAtMjc0IDgwMCAxMDAwXSAvSXRhbGljQW5nbGUgLTYgL0FzY2VudCA4MzMgL0Rlc2Nl
bnQgLTMwMCAvQ2FwSGVpZ2h0CjU3MSAvU3RlbVYgMCAvWEhlaWdodCA0MjMgL0F2Z1dpZHRoIDYw
MCAvTWF4V2lkdGggNjAwIC9Gb250RmlsZTIgMzggMCBSID4+CmVuZG9iagozOCAwIG9iago8PCAv
TGVuZ3RoIDM5IDAgUiAvTGVuZ3RoMSAxNTU3NiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJl
YW0KeAHVe3l8VNXd9zn33tm3O1tmSWbLZJKQyWSfSQYCuWSHABMgSIKkSdgUN4JsghWoGxpU4oYL
+qK11K2WSYIacKOttFrrE7W2tdYWqqi8Ki0WtFVJ5v2eOxNcnj7P+77/vJ/Pe++c/XeWe37L+Z3f
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
bpOX5ga8uGmZ0Rm+oUCbRQMuXDJJD9ulKwihavGqNTa1WpMbDHqJG5cG3PTBIqJ14OBaNJsDhYFc
ZW5uwq1x9bH/X7ndBHhPaAiRmPhgAkaELMRV0b34k4IAg8iHkr1YYzYnYORVayyQS2o1A1UzWhGx
gRDVVFT71WWylHqG7sXtag31DEEHBz2cAtJkKtkiEwijiXA6+u/L0qSzRfwU5PS1hRG6yPHJja0R
G1p2SIIvlbWS7rQxML3pPED9k1o8pAVONXCugVVubfjcwfQ56sjQT/XXGbKSqQzy17tffWXFBvU6
WRU4cp0wr2HsjXUyjfz9x7KufuV967r8eRwzivvGb7Zn1SeeTSfStnK2lnhxsuUAZcToxVIu7qCY
tTZmDVeHlBY/rqZLirttArHabDGN1mi2MDs0Vu4Wn5/ClB0K5bM0DqlMFb4KrqS0ArZmGfMtWk3G
SCWv899Y95/2tZaWhDNW7IivVbaU42wL5moSw5IfysflhnwrsVmsRFNixT5Ko4WVurTEaBulzw3H
ErBHPyf5Q+woSwzRkLvGcsQ6jewUUZ+KuJ6/hgrUVf0MbSKPQt+YXFTmnhmXGRwH0ePHmd5YWwvd
kR1eMvTEd8jnE8wCzGwRIAgsPsx+SxnHY0fQLWuFViwY2LEz66qkgfT3MwMJzjdxfiLbA05MlrJQ
VhQBxKCHEWa0wbQqGMgYHmOVk2pg0DppeMycXkFKMMPjN3XEADftqCvHbna53s8Scfuw/xf0/f4c
eyD3/Ry13mrUlY0rr5ELJnKYJkHVPM47DW69StQB/wluiNEBjI7GbKXw1ZFzOiKo4DLOrzif24C7
R6WSjaqIGv8uUamDIBC9WxRcpu0H6TJYfeaJx8UPcLVmLoSjrBVhajL6a8ZcqnB9dR3rW7gyR6ML
cP5Mj3acPrOrLwRSkkwE8R8eRnvfffC/MZyOsZtPjaSZtOI/OXPIPNx4byfz8e+AhWQR/gWxGP8M
Wco0WNS3ZNpQYm9JujrnN5y3INywZsPlq1dePm/lpvaFkVnr+y5ZvXwuevtf53XSegplbmRzdHJl
YW0KZW5kb2JqCjM5IDAgb2JqCjEwOTMzCmVuZG9iagoyMyAwIG9iago8PCAvVHlwZSAvRm9udCAv
U3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9VTFJVQ0MrQ291cmllck5ld1BTLUJvbGRNVCAv
Rm9udERlc2NyaXB0b3IKNDAgMCBSIC9FbmNvZGluZyAvTWFjUm9tYW5FbmNvZGluZyAvRmlyc3RD
aGFyIDMyIC9MYXN0Q2hhciAxMjEgL1dpZHRocyBbIDYwMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAg
MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAw
IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDYwMCAwIDYw
MCA2MDAgNjAwIDAKNjAwIDAgNjAwIDAgMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDAgNjAwIDYwMCA2
MDAgNjAwIDAgMCAwIDYwMCBdID4+CmVuZG9iago0MCAwIG9iago8PCAvVHlwZSAvRm9udERlc2Ny
aXB0b3IgL0ZvbnROYW1lIC9VTFJVQ0MrQ291cmllck5ld1BTLUJvbGRNVCAvRmxhZ3MgMzMgL0Zv
bnRCQm94ClstMTkyIC03MTAgNzAyIDEyMjJdIC9JdGFsaWNBbmdsZSAwIC9Bc2NlbnQgODMzIC9E
ZXNjZW50IC0zMDAgL0NhcEhlaWdodCA1OTIKL1N0ZW1WIDAgL1hIZWlnaHQgNDQzIC9BdmdXaWR0
aCA2MDAgL01heFdpZHRoIDYwMCAvRm9udEZpbGUyIDQxIDAgUiA+PgplbmRvYmoKNDEgMCBvYmoK
PDwgL0xlbmd0aCA0MiAwIFIgL0xlbmd0aDEgMTg0ODggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4K
c3RyZWFtCngBxXx5fFvVlf+972mXLD3JsmxZkfRkWfIi25LXxEui5y2OncXORuwQY2dxFgjYWQh7
YsqeQBOgQEuXhJa1tCA7LE6AIQwdSgspGUhJUlqUTmmA0jQpk9BCYmm+90rOUvqbmT/m8/k9+dz9
nu/dzrnn3veSjeuvHiAmMkxEoiy/cukQ4U9Qhvf28k0bmY/HsZYQnXnl0KorU3HPjYRoe1atvW5l
Kl5gJ0R+ZvXA0hWpODkLv2Y1ElJxWgU/f/WVG69NxQOH4c9YO7g8nR/8M+LBK5dem8Ynv0Vcvmrp
lQOp8jNM8EuGBjdsTMXbfgZ/xtD6gXR52k1Ilu3iuJkQilI28jlpILcSNRGIRMKkBz1Zq36PqBBn
+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
FVKepdaM8Iglvb314A1laF3vel6ZjY8ZtUkHFIZlmDlsWM0WT5R8BHvMwh0ksU0KWR++AJYWxXh+
q0y98WSbEMV7FbI+gH2HX8amjLTMzPTdLI9qafokPWG70VOJ71dURTtegj5r+fxkE7Taa+3RmupE
8eycCIz5Rqbn3tbiFDylsAwbTmltoogeYn5tWVGt6uwyi7cWYRjyhN1y8yfhx/edbAf5x8eGBJG0
4MvdNnwZ24FvPTvxzxrn4vvg+fgO8xKyCF+RLuGVKL4HTdXXQDWRhbPmLWxuDjUPXr1+zcD6OQPX
dM0vbRpcu2L2gv8Ck22noAplbmRzdHJlYW0KZW5kb2JqCjQyIDAgb2JqCjEyMzc4CmVuZG9iagox
MiAwIG9iago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9GVEVZ
VFUrSGVsdmV0aWNhLU9ibGlxdWUgL0ZvbnREZXNjcmlwdG9yCjQzIDAgUiAvRW5jb2RpbmcgL01h
Y1JvbWFuRW5jb2RpbmcgL0ZpcnN0Q2hhciAxMDEgL0xhc3RDaGFyIDExNSAvV2lkdGhzIFsKNTU2
IDAgMCAwIDAgMCAwIDAgODMzIDAgNTU2IDAgMCAwIDUwMCBdID4+CmVuZG9iago0MyAwIG9iago8
PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0ZvbnROYW1lIC9GVEVZVFUrSGVsdmV0aWNhLU9ibGlx
dWUgL0ZsYWdzIDk2IC9Gb250QkJveApbLTkzMyAtNDgxIDE1NzEgMTEzOF0gL0l0YWxpY0FuZ2xl
IC02IC9Bc2NlbnQgNzcwIC9EZXNjZW50IC0yMzAgL0NhcEhlaWdodAo3MTcgL1N0ZW1WIDk4IC9Y
SGVpZ2h0IDUyMyAvU3RlbUggODUgL0F2Z1dpZHRoIC00NDEgL01heFdpZHRoIDE1MDAgL0ZvbnRG
aWxlMgo0NCAwIFIgPj4KZW5kb2JqCjQ0IDAgb2JqCjw8IC9MZW5ndGggNDUgMCBSIC9MZW5ndGgx
IDY3MzYgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBvVl9VBRXlr+vqvqDFiMCQgPd
drdF840IRkAx2mI3oviB4kc3StINNAKRSBSJZkaHcXWMaJwkGjUmx4mTmSRKjCUQLSQq4zEn5swk
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
GQkx1pwsz76fXr7yLOclhb6CBLHn/7NDB2MpPoctoeXQGO668JNCj3VTyVKPb+myzNLgmtZgS0NN
IHtR9ZqGB/EPD+85eFig8GdKIaQU4g0NHNBpSGfh+YfVtf96htXX3tJ/Pa//H4MR9ZEKZW5kc3Ry
ZWFtCmVuZG9iago0NSAwIG9iagozODMyCmVuZG9iagoxMSAwIG9iago8PCAvVHlwZSAvRm9udCAv
U3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9US0xWRlIrQ291cmllck5ld1BTTVQgL0ZvbnRE
ZXNjcmlwdG9yCjQ2IDAgUiAvRW5jb2RpbmcgL01hY1JvbWFuRW5jb2RpbmcgL0ZpcnN0Q2hhciAz
MiAvTGFzdENoYXIgMTI1IC9XaWR0aHMgWyA2MDAKMCAwIDAgMCAwIDYwMCAwIDYwMCA2MDAgMCAw
IDYwMCAwIDYwMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNjAwIDYwMCA2MDAgNjAwCjYwMCAwIDAg
MCAwIDAgMCAwIDYwMCAwIDAgNjAwIDAgMCAwIDAgNjAwIDAgMCAwIDAgMCA2MDAgMCAwIDAgMCAw
IDAgNjAwIDAKNjAwIDAgNjAwIDAgNjAwIDAgNjAwIDYwMCA2MDAgNjAwIDYwMCAwIDYwMCAwIDYw
MCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMAo2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAw
IDYwMCA2MDAgMCA2MDAgXSA+PgplbmRvYmoKNDYgMCBvYmoKPDwgL1R5cGUgL0ZvbnREZXNjcmlw
dG9yIC9Gb250TmFtZSAvVEtMVkZSK0NvdXJpZXJOZXdQU01UIC9GbGFncyAzMyAvRm9udEJCb3gK
Wy0xMjIgLTY4MCA2MjIgMTAyMV0gL0l0YWxpY0FuZ2xlIDAgL0FzY2VudCA4MzMgL0Rlc2NlbnQg
LTMwMCAvQ2FwSGVpZ2h0IDU3MQovU3RlbVYgMCAvWEhlaWdodCA0MjMgL0F2Z1dpZHRoIDYwMCAv
TWF4V2lkdGggNjAwIC9Gb250RmlsZTIgNDcgMCBSID4+CmVuZG9iago0NyAwIG9iago8PCAvTGVu
Z3RoIDQ4IDAgUiAvTGVuZ3RoMSAyMjUxMiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0K
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
aW5nIC9NYWNSb21hbkVuY29kaW5nIC9GaXJzdENoYXIgMzIgL0xhc3RDaGFyIDEyMSAvV2lkdGhz
IFsgMjc4CjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
MCAwIDAgMCAwIDAgMCAwIDAgMCA3MjIKNjY3IDAgMCAwIDI3OCAwIDAgMCAwIDAgMCA2NjcgMCAw
IDY2NyAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDU1NiA2MTEgNTU2CjYxMSA1NTYgMCAwIDAg
Mjc4IDAgNTU2IDI3OCA4ODkgNjExIDYxMSA2MTEgMCAzODkgNTU2IDMzMyA2MTEgNTU2IDAgNTU2
IDU1NgpdID4+CmVuZG9iago0OSAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0ZvbnRO
YW1lIC9STEFaWUgrSGVsdmV0aWNhLUJvbGQgL0ZsYWdzIDMyIC9Gb250QkJveApbLTEwMTggLTQ4
MSAxNDM2IDExNTldIC9JdGFsaWNBbmdsZSAwIC9Bc2NlbnQgNzcwIC9EZXNjZW50IC0yMzAgL0Nh
cEhlaWdodAo3MjAgL1N0ZW1WIDE0OSAvWEhlaWdodCA1MzIgL1N0ZW1IIDEyNCAvQXZnV2lkdGgg
NjIxIC9NYXhXaWR0aCAxNTAwIC9Gb250RmlsZTIKNTAgMCBSID4+CmVuZG9iago1MCAwIG9iago8
PCAvTGVuZ3RoIDUxIDAgUiAvTGVuZ3RoMSAxMTIwOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+Pgpz
dHJlYW0KeAHFWgt4FFWWPrfqVlU/k+5O+pl0ujvdSef9gnTSEEgT8oKkISQQk5hoAoQFBhAUA4gw
yGMCAV8zgzxkVx2ZHcVxphMcbERclsXRQdjPQWdVZHRcAXUgMjMbZRS6ek9Vhxjy+fnxfes3W9Wn
z33fc/977rmnbtXKu+/tBi1sABYa2rqWLwD5ynwZgNHMW9q1PBZPfAH5qXk9K52xOJcDwG5dsPyf
lsbiCsxX7/qnJWuG6xvDAAmbF3Z3zY/lw3XkvoWYEIuT8cg9C5euXB2LJ9YjX7jkrnnD+cYNGPct
7Vo93D+cw7hzWdfSbuR4Zf4U/zKW33XPSjkKmWXIW5bf3T1cnrSgfG8BwVQb3AdKWAIKYECHN0oo
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
VofVfGKiRqFlnBqN16BWq3iBcSgUXoNSKQW1KqMGceIFJTiYnASHLj5RMCFGcVq1BnXkIGaokAc0
CT9WWLuNphHMhoLnLdcRH4li0KHalAfPR86j0yDpjmSZCOoPhwrUuPq+V8cNK5AUlk4O8m8oER4J
+EomE6+MDmGkp1wv6fdk1dus2VRcTiZ9/hHJF/uWrD+anpdHNv6eYVQG/RINvfv6OdZz7U3x5E7C
8omS/ZWvqPQFybdduKpwf/ZCBlrncegZVaLfU41fndTilzkzYCb6QbOgEZrwm5ZmuA2/RGmF2/E7
GOki6FcROcTjeSE01k9pa63Nru1e0tO9ctG8rtyKu5bMl0rduKTvHu9H2oGE53XwS6SXkU4hnUO6
jHQdK2iQkpFykMqQ6pHakZYg3Y+0A2kf0i+RXkY6hXQO6TLS9ejwhW3BSJjgTn5zvHJMvGpMXN5O
R9VvGJPfNCbeNSY+d0x83pg4AnOTfPLcjOpv0Zj8H4yJLxkTl79xHVV/2Zj8u8bEpbkYjc/dY+L3
jInL37COav/eMfk9Y+LyN7Ojyq+R8v8X1bGxGAplbmRzdHJlYW0KZW5kb2JqCjUxIDAgb2JqCjcw
OTAKZW5kb2JqCjUyIDAgb2JqCihJbXByb3ZlIFZhcmlhZGljIFRlbXBsYXRlcykKZW5kb2JqCjUz
IDAgb2JqCihNYWMgT1MgWCAxMC4xMS4zIFF1YXJ0eiBQREZDb250ZXh0KQplbmRvYmoKNTQgMCBv
YmoKKFBhZ2VzKQplbmRvYmoKNTUgMCBvYmoKKEQ6MjAxNjAzMTMxMjMwMThaMDAnMDAnKQplbmRv
YmoKMSAwIG9iago8PCAvVGl0bGUgNTIgMCBSIC9Qcm9kdWNlciA1MyAwIFIgL0NyZWF0b3IgNTQg
MCBSIC9DcmVhdGlvbkRhdGUgNTUgMCBSIC9Nb2REYXRlCjU1IDAgUiA+PgplbmRvYmoKeHJlZgow
IDU2CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDA5MDkxOCAwMDAwMCBuIAowMDAwMDA0NDEyIDAw
MDAwIG4gCjAwMDAwMTgyNTkgMDAwMDAgbiAKMDAwMDAwMDAyMiAwMDAwMCBuIAowMDAwMDA0Mzky
IDAwMDAwIG4gCjAwMDAwMDQ1MjIgMDAwMDAgbiAKMDAwMDAwNzQxNCAwMDAwMCBuIAowMDAwMDE4
NDEyIDAwMDAwIG4gCjAwMDAwMTA5NDIgMDAwMDAgbiAKMDAwMDA4Mjg4NyAwMDAwMCBuIAowMDAw
MDY2NzIyIDAwMDAwIG4gCjAwMDAwNjIzMDAgMDAwMDAgbiAKMDAwMDAzMzc0MyAwMDAwMCBuIAow
MDAwMDA0Njc4IDAwMDAwIG4gCjAwMDAwMDczOTMgMDAwMDAgbiAKMDAwMDAwNzQ1MCAwMDAwMCBu
IAowMDAwMDEwOTIxIDAwMDAwIG4gCjAwMDAwMTQ0NTMgMDAwMDAgbiAKMDAwMDAxMDk3OCAwMDAw
MCBuIAowMDAwMDE0NDMyIDAwMDAwIG4gCjAwMDAwMTQ1NjYgMDAwMDAgbiAKMDAwMDAzNzI5MCAw
MDAwMCBuIAowMDAwMDQ5MTY2IDAwMDAwIG4gCjAwMDAwMTc5ODkgMDAwMDAgbiAKMDAwMDAxNDcz
NSAwMDAwMCBuIAowMDAwMDE3OTY4IDAwMDAwIG4gCjAwMDAwMTgxMDIgMDAwMDAgbiAKMDAwMDAx
ODM2MiAwMDAwMCBuIAowMDAwMDE5MTAzIDAwMDAwIG4gCjAwMDAwMTkzNTMgMDAwMDAgbiAKMDAw
MDAzMzcyMSAwMDAwMCBuIAowMDAwMDM0MjI1IDAwMDAwIG4gCjAwMDAwMzM5MDYgMDAwMDAgbiAK
MDAwMDAzNDIwNSAwMDAwMCBuIAowMDAwMDM0NDc0IDAwMDAwIG4gCjAwMDAwMzcyNjkgMDAwMDAg
biAKMDAwMDAzNzg3MCAwMDAwMCBuIAowMDAwMDM4MTIwIDAwMDAwIG4gCjAwMDAwNDkxNDQgMDAw
MDAgbiAKMDAwMDA0OTU2MiAwMDAwMCBuIAowMDAwMDQ5ODA5IDAwMDAwIG4gCjAwMDAwNjIyNzgg
MDAwMDAgbiAKMDAwMDA2MjUxOSAwMDAwMCBuIAowMDAwMDYyNzc5IDAwMDAwIG4gCjAwMDAwNjY3
MDEgMDAwMDAgbiAKMDAwMDA2NzE3MyAwMDAwMCBuIAowMDAwMDY3NDE1IDAwMDAwIG4gCjAwMDAw
ODI4NjUgMDAwMDAgbiAKMDAwMDA4MzI5NCAwMDAwMCBuIAowMDAwMDgzNTUyIDAwMDAwIG4gCjAw
MDAwOTA3MzMgMDAwMDAgbiAKMDAwMDA5MDc1NCAwMDAwMCBuIAowMDAwMDkwNzk5IDAwMDAwIG4g
CjAwMDAwOTA4NTIgMDAwMDAgbiAKMDAwMDA5MDg3NiAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXpl
IDU2IC9Sb290IDI4IDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8N2U0NGIwOWVmNTNjYzM4ZGRiY2Rm
ZjkwMzNjYTkxM2Q+Cjw3ZTQ0YjA5ZWY1M2NjMzhkZGJjZGZmOTAzM2NhOTEzZD4gXSA+PgpzdGFy
dHhyZWYKOTEwMjMKJSVFT0YK
--Apple-Mail=_74AE534F-95E1-4109-BD80-FEE365E9A2F6--

.


Author: inkwizytoryankes@gmail.com
Date: Sun, 13 Mar 2016 07:13:35 -0700 (PDT)
Raw View
------=_Part_144_1763182965.1457878415836
Content-Type: multipart/alternative;
 boundary="----=_Part_145_146810094.1457878415836"

------=_Part_145_146810094.1457878415836
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable



On Sunday, March 13, 2016 at 1:44:30 PM UTC+1, Daniel Frey wrote:
>
> > On 06.03.2016, at 19:55, Arthur O'Dwyer <arthur....@gmail.com=20
> <javascript:>> wrote:=20
> >=20
> > > > In the part of my post that you snipped, I indicated that=20
> "generating an unexpanded=20
> > > > parameter pack" is a liability, not an advantage. You seemed to=20
> agree ("Good catch=20
> > > > ... I'll reconsider that one ...").  Maybe I should say is currentl=
y=20
> a liability. It would be=20
> > > > awesome to have first-class parameter packs, but I think there are=
=20
> deep problems=20
> > > > someone needs to solve before we can get them.=20
> > >=20
> > > When I said =E2=80=9CGood catch=E2=80=9D I meant that you spotted a p=
roblem that I=20
> haven=E2=80=99t realized=20
> > > before. It=E2=80=99s an interesting problem and, of course, it makes =
me=20
> reconsider given that=20
> > > you, IIUC, raised it in the context of my proposed language addition=
=20
> 3).=20
> >=20
> > It also applies to addition (2), because that also turns a non-pack=20
> expression into a (first-class) parameter pack.=20
>
> I think I now have a solution for the problem you spotted with (2) and=20
> (3), the new proposal (attached) solves this by not allowing in-situ=20
> creation or in-situ access to member packs. In short, I only propose two=
=20
> new features now:=20
>
> (1) Pack selection:=20
>
>   pattern...[I]=20
>
> (2) Pack declaration:=20
>
>   typename... Ts; // empty pack=20
>   typename... Ts =3D int, void, double&&;=20
>   using typename... Ts =3D my_class<int>::types; // access pack member, t=
his=20
> can not be templated=20
>   std::size_t... Vs; // empty pack=20
>   std::size_t... Vs =3D 3, 0, 1, 42;=20
>   using std::size_t... Vs =3D my_class<int>::values;=20
>   std::size_t... Vs =3D ... 4; // yields 0, 1, 2, 3=20
>
> I'll improve the proposal with better examples, rationale, etc. later on,=
=20
> but I'd like to get some feedback if you (and others) agree that the abov=
e=20
> avoids the problems that the previous proposal had and in general if the=
=20
> syntax and the feature are the right fundamentals to write easier and=20
> better code.=20
>
> -- Daniel=20
>
>
>  I think syntax of `using` should look like:

using Ts =3D typename... X<int>::pack; //like `using T =3D typename=20
X<int>::type;`
using Vs =3D std::size_t... Y<int>::values_pack;
template<typename T, typename X>
using Xs =3D T... X::pack; // using "Name" =3D "Category" "Value";

I don't think that you need `...4` because if we allow templated `using`=20
packs then you can get this from:

template<int I>
using seq_p =3D std::size_t... std::make_index_sequence<I>::pack;

using Vs =3D seq_p<I>; //like `using T =3D aligned_storage_t<16>;`



--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/9e860a24-5c74-48c9-8c9b-e66ba57bb47e%40isocpp.or=
g.

------=_Part_145_146810094.1457878415836
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Sunday, March 13, 2016 at 1:44:30 PM UTC+1, Dan=
iel Frey wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-=
left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">&gt; On 06.03.2=
016, at 19:55, Arthur O&#39;Dwyer &lt;<a href=3D"javascript:" target=3D"_bl=
ank" gdf-obfuscated-mailto=3D"yJ2XUwHNBwAJ" rel=3D"nofollow" onmousedown=3D=
"this.href=3D&#39;javascript:&#39;;return true;" onclick=3D"this.href=3D&#3=
9;javascript:&#39;;return true;">arthur....@gmail.com</a>&gt; wrote:
<br>&gt;=20
<br>&gt; &gt; &gt; In the part of my post that you snipped, I indicated tha=
t &quot;generating an unexpanded
<br>&gt; &gt; &gt; parameter pack&quot; is a liability, not an advantage. Y=
ou seemed to agree (&quot;Good catch
<br>&gt; &gt; &gt; ... I&#39;ll reconsider that one ...&quot;). =C2=A0Maybe=
 I should say is currently a liability. It would be
<br>&gt; &gt; &gt; awesome to have first-class parameter packs, but I think=
 there are deep problems
<br>&gt; &gt; &gt; someone needs to solve before we can get them.
<br>&gt; &gt;
<br>&gt; &gt; When I said =E2=80=9CGood catch=E2=80=9D I meant that you spo=
tted a problem that I haven=E2=80=99t realized
<br>&gt; &gt; before. It=E2=80=99s an interesting problem and, of course, i=
t makes me reconsider given that
<br>&gt; &gt; you, IIUC, raised it in the context of my proposed language a=
ddition 3).
<br>&gt;=20
<br>&gt; It also applies to addition (2), because that also turns a non-pac=
k expression into a (first-class) parameter pack.
<br>
<br>I think I now have a solution for the problem you spotted with (2) and =
(3), the new proposal (attached) solves this by not allowing in-situ creati=
on or in-situ access to member packs. In short, I only propose two new feat=
ures now:
<br>
<br>(1) Pack selection:
<br>
<br>=C2=A0 pattern...[I]
<br>
<br>(2) Pack declaration:
<br>
<br>=C2=A0 typename... Ts; // empty pack
<br>=C2=A0 typename... Ts =3D int, void, double&amp;&amp;;
<br>=C2=A0 using typename... Ts =3D my_class&lt;int&gt;::types; // access p=
ack member, this can not be templated
<br>=C2=A0 std::size_t... Vs; // empty pack
<br>=C2=A0 std::size_t... Vs =3D 3, 0, 1, 42;
<br>=C2=A0 using std::size_t... Vs =3D my_class&lt;int&gt;::values;
<br>=C2=A0 std::size_t... Vs =3D ... 4; // yields 0, 1, 2, 3
<br>
<br>I&#39;ll improve the proposal with better examples, rationale, etc. lat=
er on, but I&#39;d like to get some feedback if you (and others) agree that=
 the above avoids the problems that the previous proposal had and in genera=
l if the syntax and the feature are the right fundamentals to write easier =
and better code.
<br>
<br>-- Daniel
<br>
<br>
<br></blockquote><div>=C2=A0I think syntax of `using` should look like:<br>=
<br><div class=3D"prettyprint" style=3D"background-color: rgb(250, 250, 250=
); border-color: rgb(187, 187, 187); border-style: solid; border-width: 1px=
; word-wrap: break-word;"><code class=3D"prettyprint"><div class=3D"subpret=
typrint"><span style=3D"color: #008;" class=3D"styled-by-prettify">using</s=
pan><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span=
 style=3D"color: #606;" class=3D"styled-by-prettify">Ts</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color=
: #660;" class=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;=
" class=3D"styled-by-prettify"> </span><span style=3D"color: #008;" class=
=3D"styled-by-prettify">typename</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">...</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"> X</span><span style=3D"color: #080;" class=3D"styled-by-p=
rettify">&lt;int&gt;</span><span style=3D"color: #660;" class=3D"styled-by-=
prettify">::</span><span style=3D"color: #000;" class=3D"styled-by-prettify=
">pack</span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</s=
pan><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span=
 style=3D"color: #800;" class=3D"styled-by-prettify">//like `using T =3D ty=
pename X&lt;int&gt;::type;`</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"><br></span><span style=3D"color: #008;" class=3D"styled-by=
-prettify">using</span><span style=3D"color: #000;" class=3D"styled-by-pret=
tify"> </span><span style=3D"color: #606;" class=3D"styled-by-prettify">Vs<=
/span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><sp=
an style=3D"color: #660;" class=3D"styled-by-prettify">=3D</span><span styl=
e=3D"color: #000;" class=3D"styled-by-prettify"> std</span><span style=3D"c=
olor: #660;" class=3D"styled-by-prettify">::</span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify">size_t</span><span style=3D"color: #660;"=
 class=3D"styled-by-prettify">...</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> Y</span><span style=3D"color: #080;" class=3D"styl=
ed-by-prettify">&lt;int&gt;</span><span style=3D"color: #660;" class=3D"sty=
led-by-prettify">::</span><span style=3D"color: #000;" class=3D"styled-by-p=
rettify">values_pack</span><span style=3D"color: #660;" class=3D"styled-by-=
prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"=
><br></span><span style=3D"color: #008;" class=3D"styled-by-prettify">templ=
ate</span><span style=3D"color: #660;" class=3D"styled-by-prettify">&lt;</s=
pan><span style=3D"color: #008;" class=3D"styled-by-prettify">typename</spa=
n><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"styled-by-prettify"> </span><span style=3D"color: #0=
08;" class=3D"styled-by-prettify">typename</span><span style=3D"color: #000=
;" class=3D"styled-by-prettify"> X</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">&gt;</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"><br></span><span style=3D"color: #008;" class=3D"styled-b=
y-prettify">using</span><span style=3D"color: #000;" class=3D"styled-by-pre=
ttify"> </span><span style=3D"color: #606;" class=3D"styled-by-prettify">Xs=
</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><s=
pan style=3D"color: #660;" class=3D"styled-by-prettify">=3D</span><span sty=
le=3D"color: #000;" class=3D"styled-by-prettify"> T</span><span style=3D"co=
lor: #660;" class=3D"styled-by-prettify">...</span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify"> X</span><span style=3D"color: #660;" cla=
ss=3D"styled-by-prettify">::</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify">pack</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"> </span><span style=3D"color: #800;" class=3D"styled-by-prettify">// usi=
ng &quot;Name&quot; =3D &quot;Category&quot; &quot;Value&quot;;</span><span=
 style=3D"color: #000;" class=3D"styled-by-prettify"><br></span></div></cod=
e></div><br>I don&#39;t think that you need `...4` because if we allow temp=
lated `using` packs then you can get this from:<br><br><div class=3D"pretty=
print" style=3D"background-color: rgb(250, 250, 250); border-color: rgb(187=
, 187, 187); border-style: solid; border-width: 1px; word-wrap: break-word;=
"><code class=3D"prettyprint"><div class=3D"subprettyprint"><span style=3D"=
color: #008;" class=3D"styled-by-prettify">template</span><span style=3D"co=
lor: #660;" class=3D"styled-by-prettify">&lt;</span><span style=3D"color: #=
008;" class=3D"styled-by-prettify">int</span><span style=3D"color: #000;" c=
lass=3D"styled-by-prettify"> I</span><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 style=3D"color: #008;" class=3D"styled-by-pr=
ettify">using</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"> seq_p </span><span style=3D"color: #660;" class=3D"styled-by-prettify">=
=3D</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> std</s=
pan><span style=3D"color: #660;" class=3D"styled-by-prettify">::</span><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify">size_t</span><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify">...</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify"> std</span><span style=3D"color:=
 #660;" class=3D"styled-by-prettify">::</span><span style=3D"color: #000;" =
class=3D"styled-by-prettify">make_index_sequence</span><span style=3D"color=
: #660;" class=3D"styled-by-prettify">&lt;</span><span style=3D"color: #000=
;" class=3D"styled-by-prettify">I</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">&gt;::</span><span style=3D"color: #000;" class=3D"=
styled-by-prettify">pack</span><span style=3D"color: #660;" class=3D"styled=
-by-prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-prett=
ify"><br><br></span><span style=3D"color: #008;" class=3D"styled-by-prettif=
y">using</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> <=
/span><span style=3D"color: #606;" class=3D"styled-by-prettify">Vs</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">=3D</span><span style=3D"col=
or: #000;" class=3D"styled-by-prettify"> seq_p</span><span style=3D"color: =
#660;" class=3D"styled-by-prettify">&lt;</span><span style=3D"color: #000;"=
 class=3D"styled-by-prettify">I</span><span style=3D"color: #660;" class=3D=
"styled-by-prettify">&gt;;</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify"> </span><span style=3D"color: #800;" class=3D"styled-by-pre=
ttify">//like `using T =3D aligned_storage_t&lt;16&gt;;`</span></div></code=
></div><br><br><br></div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/9e860a24-5c74-48c9-8c9b-e66ba57bb47e%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/9e860a24-5c74-48c9-8c9b-e66ba57bb47e=
%40isocpp.org</a>.<br />

------=_Part_145_146810094.1457878415836--
------=_Part_144_1763182965.1457878415836--

.


Author: Daniel Frey <d.frey@gmx.de>
Date: Sun, 13 Mar 2016 15:54:56 +0100
Raw View
> On 13.03.2016, at 15:13, inkwizytoryankes@gmail.com wrote:
>=20
>> On Sunday, March 13, 2016 at 1:44:30 PM UTC+1, Daniel Frey wrote:
>> > On 06.03.2016, at 19:55, Arthur O'Dwyer <arthur....@gmail.com> wrote:=
=20
>> >=20
>> > > > In the part of my post that you snipped, I indicated that "generat=
ing an unexpanded=20
>> > > > parameter pack" is a liability, not an advantage. You seemed to ag=
ree ("Good catch=20
>> > > > ... I'll reconsider that one ...").  Maybe I should say is current=
ly a liability. It would be=20
>> > > > awesome to have first-class parameter packs, but I think there are=
 deep problems=20
>> > > > someone needs to solve before we can get them.=20
>> > >=20
>> > > When I said =E2=80=9CGood catch=E2=80=9D I meant that you spotted a =
problem that I haven=E2=80=99t realized=20
>> > > before. It=E2=80=99s an interesting problem and, of course, it makes=
 me reconsider given that=20
>> > > you, IIUC, raised it in the context of my proposed language addition=
 3).=20
>> >=20
>> > It also applies to addition (2), because that also turns a non-pack ex=
pression into a (first-class) parameter pack.=20
>>=20
>> I think I now have a solution for the problem you spotted with (2) and (=
3), the new proposal (attached) solves this by not allowing in-situ creatio=
n or in-situ access to member packs. In short, I only propose two new featu=
res now:=20
>>=20
>> (1) Pack selection:=20
>>=20
>>   pattern...[I]=20
>>=20
>> (2) Pack declaration:=20
>>=20
>>   typename... Ts; // empty pack=20
>>   typename... Ts =3D int, void, double&&;=20
>>   using typename... Ts =3D my_class<int>::types; // access pack member, =
this can not be templated=20
>>   std::size_t... Vs; // empty pack=20
>>   std::size_t... Vs =3D 3, 0, 1, 42;=20
>>   using std::size_t... Vs =3D my_class<int>::values;=20
>>   std::size_t... Vs =3D ... 4; // yields 0, 1, 2, 3=20
>>=20
>> I'll improve the proposal with better examples, rationale, etc. later on=
, but I'd like to get some feedback if you (and others) agree that the abov=
e avoids the problems that the previous proposal had and in general if the =
syntax and the feature are the right fundamentals to write easier and bette=
r code.=20
>>=20
>> -- Daniel=20
>>=20
>=20
>  I think syntax of `using` should look like:

> using Ts =3D typename... X<int>::pack; //like `using T =3D typename X<int=
>::type;`
> using Vs =3D std::size_t... Y<int>::values_pack;

Or maybe just

  using... Ts =3D X<int>::pack;

After all, ::pack defines what it is already. I wonder if the proposal's (2=
) should be split into (2) containing syntax 1.1, 1.2, 2.1, 2.2 and 2.4 and=
 a separate (3) for syntax 1.3 and 2.3 or even better the above "using...".

> template<typename T, typename X>
> using Xs =3D T... X::pack; // using "Name" =3D "Category" "Value";

This would be a major problem, exactly what I tried to avoid. The usage cou=
ld otherwise be an expression like

  template<typename... Ts> void bar() { return f(g(Xs<Ts>{}...)...; }  // r=
eturn ???

and you have to define what is expanded in which order. That's the problem =
Arthur spotted and which you either solve (which seems hard) or avoid.

> I don't think that you need `...4` because if we allow templated `using` =
packs then you can get this from:

Still it is very indirect and very inefficient. Plus your example is using =
the templated using for parameter packs which I can not allow.

The proposal is mostly meant to speed up compiler efficiency, hence most us=
es of make_integer_sequence should be replaced with the new syntax 2.4 and =
make_integer_sequence itself should be implemented with it as shown in the =
proposal.

-- Daniel

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/5DC32FDA-F9B5-44BF-A1A2-07360D30FE38%40gmx.de.

.


Author: Daniel Frey <d.frey@gmx.de>
Date: Sun, 13 Mar 2016 15:59:55 +0100
Raw View
--Apple-Mail=_EB1BB6C6-B42B-4C64-937C-FFD3AFCA29A5
Content-Type: text/plain; charset=UTF-8

> On 13.03.2016, at 15:54, Daniel Frey <d.frey@gmx.de> wrote:
>
>> template<typename T, typename X>
>> using Xs = T... X::pack; // using "Name" = "Category" "Value";
>
> This would be a major problem, exactly what I tried to avoid. The usage could otherwise be an expression like
>
>  template<typename... Ts> void bar() { return f(g(Xs<Ts>{}...)...; }  // return ???

That should be

  template<typename T, typename... Ts>
  void bar()
  {
    return f(g(Xs<T, Ts>{}...)...);
  }

but you get the idea... :)

--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/A07AFE98-4C54-4DF9-86A5-91BFE669269B%40gmx.de.

--Apple-Mail=_EB1BB6C6-B42B-4C64-937C-FFD3AFCA29A5
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename=signature.asc
Content-Type: application/pgp-signature;
 name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iEYEARECAAYFAlblgGsACgkQAUxJbew56yHR8ACfWJK/B+aBNarQRXlsYrncY9yh
bg0AnROh0fcuAuYJez8U+pep1PQ3ysKb
=/ZDV
-----END PGP SIGNATURE-----

--Apple-Mail=_EB1BB6C6-B42B-4C64-937C-FFD3AFCA29A5--

.


Author: inkwizytoryankes@gmail.com
Date: Sun, 13 Mar 2016 12:32:18 -0700 (PDT)
Raw View
------=_Part_3552_934092448.1457897538892
Content-Type: multipart/alternative;
 boundary="----=_Part_3553_249370385.1457897538893"

------=_Part_3553_249370385.1457897538893
Content-Type: text/plain; charset=UTF-8



On Sunday, March 13, 2016 at 3:59:58 PM UTC+1, Daniel Frey wrote:
>
> > On 13.03.2016, at 15:54, Daniel Frey <d.f...@gmx.de <javascript:>>
> wrote:
> >
> >> template<typename T, typename X>
> >> using Xs = T... X::pack; // using "Name" = "Category" "Value";
> >
> > This would be a major problem, exactly what I tried to avoid. The usage
> could otherwise be an expression like
> >
> >  template<typename... Ts> void bar() { return f(g(Xs<Ts>{}...)...; }  //
> return ???
>
> That should be
>
>   template<typename T, typename... Ts>
>   void bar()
>   {
>     return f(g(Xs<T, Ts>{}...)...);
>   }
>
> but you get the idea... :)
>
>
`Xs` is pack and can be expand only once. First `...` apply to `Xs` not to
`Ts`. This mean `Xs<T, Ts>` is invalid because `Ts` is not expand.
I think it should work like:

return f(g(Xs<T, Ts...>{}...));
//or
return f(g(Xs<T, Ts...>{})...);


As we see this is only one expansion. To have second one, I think we would
need pack of pack to handle it:

template<typename T>
using id_t = T;
template<typename... T>
using id_p = typename... T; //Identity pack `id_p<T...> === T`
template<typename... T>
using apply_p = typename... id_t<T>; //Transform `apply_p<T...> === id_t<T>`

template<typename T, typename... Ts>
using Xpp = typename... ... apply_p<T, Ts>; //Transform `Xpp<T, Ts...> ===
apply_p<T, Ts>` this is pack of pack

return f(g(Xpp<Tsingle, Ts...>{}...)...); //if Ts=[T1, T2] then this is
equal `return f(g(id_t<Tsingle>{}, id_t<Tsingle>{}), g(id_t<T1>{},
id_t<T2>{}));`


This is because first `...` expand to `g(apply_p<Tsingle, T1>{},
apply_p<Tsingle, T2>{})` where this both are parameter packs.



--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/d05523a6-7026-4fed-8a17-4f71c9c02848%40isocpp.org.

------=_Part_3553_249370385.1457897538893
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Sunday, March 13, 2016 at 3:59:58 PM UTC+1, Dan=
iel Frey wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-=
left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">&gt; On 13.03.2=
016, at 15:54, Daniel Frey &lt;<a href=3D"javascript:" target=3D"_blank" gd=
f-obfuscated-mailto=3D"zcujqWXUBwAJ" rel=3D"nofollow" onmousedown=3D"this.h=
ref=3D&#39;javascript:&#39;;return true;" onclick=3D"this.href=3D&#39;javas=
cript:&#39;;return true;">d.f...@gmx.de</a>&gt; wrote:
<br>&gt;=20
<br>&gt;&gt; template&lt;typename T, typename X&gt;
<br>&gt;&gt; using Xs =3D T... X::pack; // using &quot;Name&quot; =3D &quot=
;Category&quot; &quot;Value&quot;;
<br>&gt;=20
<br>&gt; This would be a major problem, exactly what I tried to avoid. The =
usage could otherwise be an expression like
<br>&gt;=20
<br>&gt; =C2=A0template&lt;typename... Ts&gt; void bar() { return f(g(Xs&lt=
;Ts&gt;{}...)...; } =C2=A0// return ???
<br>
<br>That should be
<br>
<br>=C2=A0 template&lt;typename T, typename... Ts&gt;
<br>=C2=A0 void bar()
<br>=C2=A0 {
<br>=C2=A0 =C2=A0 return f(g(Xs&lt;T, Ts&gt;{}...)...);
<br>=C2=A0 }
<br>
<br>but you get the idea... :)
<br>
<br></blockquote><div>=C2=A0<br>`Xs` is pack and can be expand only once. F=
irst `...` apply to `Xs` not to `Ts`. This mean `Xs&lt;T, Ts&gt;` is invali=
d because `Ts` is not expand.<br>I think it should work like:<br><div class=
=3D"prettyprint" style=3D"background-color: rgb(250, 250, 250); border-colo=
r: rgb(187, 187, 187); border-style: solid; border-width: 1px; word-wrap: b=
reak-word;"><code class=3D"prettyprint"><div class=3D"subprettyprint"><span=
 style=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span style=
=3D"color: #008;" class=3D"styled-by-prettify">return</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify"> f</span><span style=3D"color: #=
660;" class=3D"styled-by-prettify">(</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify">g</span><span style=3D"color: #660;" class=3D"sty=
led-by-prettify">(</span><span style=3D"color: #606;" class=3D"styled-by-pr=
ettify">Xs</span><span style=3D"color: #660;" class=3D"styled-by-prettify">=
&lt;</span><span style=3D"color: #000;" class=3D"styled-by-prettify">T</spa=
n><span style=3D"color: #660;" class=3D"styled-by-prettify">,</span><span s=
tyle=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"c=
olor: #606;" class=3D"styled-by-prettify">Ts</span><span style=3D"color: #6=
60;" class=3D"styled-by-prettify">...&gt;{}...));</span><span style=3D"colo=
r: #000;" class=3D"styled-by-prettify"><br></span><span style=3D"color: #80=
0;" class=3D"styled-by-prettify">//or</span><span style=3D"color: #000;" cl=
ass=3D"styled-by-prettify"><br></span><span style=3D"color: #008;" class=3D=
"styled-by-prettify">return</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"> f</span><span style=3D"color: #660;" class=3D"styled-by-p=
rettify">(</span><span style=3D"color: #000;" class=3D"styled-by-prettify">=
g</span><span style=3D"color: #660;" class=3D"styled-by-prettify">(</span><=
span style=3D"color: #606;" class=3D"styled-by-prettify">Xs</span><span sty=
le=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: #6=
60;" class=3D"styled-by-prettify">,</span><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"> </span><span style=3D"color: #606;" class=3D"styl=
ed-by-prettify">Ts</span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">...&gt;{})...);</span></div></code></div><br><br>As we see this is =
only one expansion. To have second one, I think we would need pack of pack =
to handle it:<br><div class=3D"prettyprint" style=3D"background-color: rgb(=
250, 250, 250); border-color: rgb(187, 187, 187); border-style: solid; bord=
er-width: 1px; word-wrap: break-word;"><code class=3D"prettyprint"><div cla=
ss=3D"subprettyprint"><span style=3D"color: #000;" class=3D"styled-by-prett=
ify"><br></span><span style=3D"color: #008;" class=3D"styled-by-prettify">t=
emplate</span><span style=3D"color: #660;" class=3D"styled-by-prettify">&lt=
;</span><span style=3D"color: #008;" class=3D"styled-by-prettify">typename<=
/span><span style=3D"color: #000;" class=3D"styled-by-prettify"> T</span><s=
pan style=3D"color: #660;" class=3D"styled-by-prettify">&gt;</span><span st=
yle=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span style=3D=
"color: #008;" class=3D"styled-by-prettify">using</span><span style=3D"colo=
r: #000;" class=3D"styled-by-prettify"> id_t </span><span style=3D"color: #=
660;" class=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;" c=
lass=3D"styled-by-prettify"> T</span><span style=3D"color: #660;" class=3D"=
styled-by-prettify">;</span><span style=3D"color: #000;" class=3D"styled-by=
-prettify"><br></span><span style=3D"color: #008;" class=3D"styled-by-prett=
ify">template</span><span style=3D"color: #660;" class=3D"styled-by-prettif=
y">&lt;</span><span style=3D"color: #008;" class=3D"styled-by-prettify">typ=
ename</span><span style=3D"color: #660;" class=3D"styled-by-prettify">...</=
span><span style=3D"color: #000;" class=3D"styled-by-prettify"> T</span><sp=
an style=3D"color: #660;" class=3D"styled-by-prettify">&gt;</span><span sty=
le=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span style=3D"=
color: #008;" class=3D"styled-by-prettify">using</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"> id_p </span><span style=3D"color: #6=
60;" class=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;" cl=
ass=3D"styled-by-prettify"> </span><span style=3D"color: #008;" class=3D"st=
yled-by-prettify">typename</span><span style=3D"color: #660;" class=3D"styl=
ed-by-prettify">...</span><span style=3D"color: #000;" class=3D"styled-by-p=
rettify"> T</span><span style=3D"color: #660;" class=3D"styled-by-prettify"=
>;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span>=
<span style=3D"color: #800;" class=3D"styled-by-prettify">//Identity pack `=
id_p&lt;T...&gt; =3D=3D=3D T`</span><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify"><br></span><span style=3D"color: #008;" class=3D"styled-=
by-prettify">template</span><span style=3D"color: #660;" class=3D"styled-by=
-prettify">&lt;</span><span style=3D"color: #008;" class=3D"styled-by-prett=
ify">typename</span><span style=3D"color: #660;" class=3D"styled-by-prettif=
y">...</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"><br></span><span s=
tyle=3D"color: #008;" class=3D"styled-by-prettify">using</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> apply_p </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 style=3D"color: #008;=
" class=3D"styled-by-prettify">typename</span><span style=3D"color: #660;" =
class=3D"styled-by-prettify">...</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> id_t</span><span style=3D"color: #660;" class=3D"s=
tyled-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-pretti=
fy">&gt;;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> =
</span><span style=3D"color: #800;" class=3D"styled-by-prettify">//Transfor=
m `apply_p&lt;T...&gt; =3D=3D=3D id_t&lt;T&gt;`</span><span style=3D"color:=
 #000;" class=3D"styled-by-prettify"><br><br></span><span style=3D"color: #=
008;" class=3D"styled-by-prettify">template</span><span style=3D"color: #66=
0;" class=3D"styled-by-prettify">&lt;</span><span style=3D"color: #008;" cl=
ass=3D"styled-by-prettify">typename</span><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"> T</span><span style=3D"color: #660;" class=3D"sty=
led-by-prettify">,</span><span style=3D"color: #000;" class=3D"styled-by-pr=
ettify"> </span><span style=3D"color: #008;" class=3D"styled-by-prettify">t=
ypename</span><span style=3D"color: #660;" class=3D"styled-by-prettify">...=
</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><s=
pan style=3D"color: #606;" class=3D"styled-by-prettify">Ts</span><span styl=
e=3D"color: #660;" class=3D"styled-by-prettify">&gt;</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"><br></span><span style=3D"color: =
#008;" class=3D"styled-by-prettify">using</span><span style=3D"color: #000;=
" class=3D"styled-by-prettify"> </span><span style=3D"color: #606;" class=
=3D"styled-by-prettify">Xpp</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">=3D</span><span style=3D"color: #000;" class=3D"styled-by-prettify"=
> </span><span style=3D"color: #008;" class=3D"styled-by-prettify">typename=
</span><span style=3D"color: #660;" class=3D"styled-by-prettify">...</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span sty=
le=3D"color: #660;" class=3D"styled-by-prettify">...</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"> apply_p</span><span style=3D"col=
or: #660;" class=3D"styled-by-prettify">&lt;</span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify">T</span><span style=3D"color: #660;" clas=
s=3D"styled-by-prettify">,</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify"> </span><span style=3D"color: #606;" class=3D"styled-by-pre=
ttify">Ts</span><span style=3D"color: #660;" class=3D"styled-by-prettify">&=
gt;;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </spa=
n><span style=3D"color: #800;" class=3D"styled-by-prettify">//Transform `Xp=
p&lt;T, Ts...&gt; =3D=3D=3D apply_p&lt;T, Ts&gt;` this is pack of pack</spa=
n><span style=3D"color: #000;" class=3D"styled-by-prettify"><br><br></span>=
<span style=3D"color: #008;" class=3D"styled-by-prettify">return</span><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify"> f</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify">g</span><span style=3D"color: #660;" =
class=3D"styled-by-prettify">(</span><span style=3D"color: #606;" class=3D"=
styled-by-prettify">Xpp</span><span style=3D"color: #660;" class=3D"styled-=
by-prettify">&lt;</span><span style=3D"color: #606;" class=3D"styled-by-pre=
ttify">Tsingle</span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">,</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </sp=
an><span style=3D"color: #606;" class=3D"styled-by-prettify">Ts</span><span=
 style=3D"color: #660;" class=3D"styled-by-prettify">...&gt;{}...)...);</sp=
an><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span =
style=3D"color: #800;" class=3D"styled-by-prettify">//if Ts=3D[T1, T2] then=
 this is equal `return f(g(id_t&lt;Tsingle&gt;{}, id_t&lt;Tsingle&gt;{}), g=
(id_t&lt;T1&gt;{}, id_t&lt;T2&gt;{}));`</span><span style=3D"color: #000;" =
class=3D"styled-by-prettify"><br><br></span></div></code></div><br>This is =
because first `...` expand to `g(apply_p&lt;Tsingle, T1&gt;{}, apply_p&lt;T=
single, T2&gt;{})` where this both are parameter packs.<br><br><br><br></di=
v></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/d05523a6-7026-4fed-8a17-4f71c9c02848%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/d05523a6-7026-4fed-8a17-4f71c9c02848=
%40isocpp.org</a>.<br />

------=_Part_3553_249370385.1457897538893--
------=_Part_3552_934092448.1457897538892--

.


Author: Daniel Frey <d.frey@gmx.de>
Date: Sun, 13 Mar 2016 22:27:18 +0100
Raw View
--Apple-Mail=_85107863-674D-4C1F-8235-E99F59F4760C
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8

> On 13.03.2016, at 20:32, inkwizytoryankes@gmail.com wrote:
>> On Sunday, March 13, 2016 at 3:59:58 PM UTC+1, Daniel Frey wrote:
>> > On 13.03.2016, at 15:54, Daniel Frey <d.f...@gmx.de> wrote:
>> >
>> >> template<typename T, typename X>
>> >> using Xs =3D T... X::pack; // using "Name" =3D "Category" "Value";
>> >
>> > This would be a major problem, exactly what I tried to avoid. The usag=
e could otherwise be an expression like
>> >
>> >  template<typename... Ts> void bar() { return f(g(Xs<Ts>{}...)...; }  =
// return ???
>>=20
>> That should be
>>=20
>>   template<typename T, typename... Ts>
>>   void bar()
>>   {
>>     return f(g(Xs<T, Ts>{}...)...);
>>   }
>>=20
>> but you get the idea... :)
>=20
> `Xs` is pack and can be expand only once. First `...` apply to `Xs` not t=
o `Ts`. This mean `Xs<T, Ts>` is invalid because `Ts` is not expand.

Ts as also a pack. This is not defined by todays C++, hence you are express=
ing an idea you have, not a current reality. Other options exist of what th=
e above could mean in the future. No option is the right one, it is a choic=
e.

> I think it should work like:
>=20
> return f(g(Xs<T, Ts...>{}...));

This would be unambiguous. Let's say Xs =3D {A,B,C}, Ts =3D {int,long}:

return f(g(Xs<T, Ts...>{}...));
return f(g(Xs<T, int, long>{}...));
return f(g(A<T, int, long>{}, B<T, int, long>{}, C<T, int, long>{}));

> return f(g(Xs<T, Ts...>{})...);

return f(g(Xs<T, Ts...>{}...));
return f(g(Xs<T, int, long>{}...));
return f(g(A<T, int, long>{}, g(B<T, int, long>{}), g(C<T, int, long>{})));

OK, how do you expand to:

return f(g(A<T, int>{}, A<T, long>{}), g(B<T, int>{}, B<T, long>{}), g(C<T,=
 int>{}, C<T, long>{})); // (e1)

or

return f(g(A<T, int>{}, B<T, int>{}, C<T, int>{}), g(A<T, long>{}, B<T, lon=
g>{}, C<T, long>{})); // (e2)

or

return f(g(A<T, int>{}, A<T, long>{}, B<T, int>{}, B<T, long>{}, C<T, int>{=
}, C<T, long>{})); // (e3)

or

return f(g(A<T, int>{}, B<T, int>{}, C<T, int>{}, A<T, long>{}, B<T, long>{=
}, C<T, long>{})); // (e4)

> As we see this is only one expansion. To have second one, I think we woul=
d need pack of pack to handle it:

And this is one of the things I'd like to avoid: Creating a pack of packs (=
and by induction a pack of packs of packs, etc.). It means creating new ent=
ities that don't exist today in a compiler's backend. The complexity to imp=
lement a proposal which does something like that is much higher and the ris=
k of introducing new bugs makes it less likely that a proposal will be acce=
pted.

Anyways, if you *really* want to do something like this I think it makes mu=
ch more sense to have "partial expansion" something like:

return f(g(Xs<T, Ts>{}...[Ts])...); // generates (e1)
                      ^^^^^^^
possible syntax when the brackets don't contain an integral constant as in =
my proposal (1), but instead a pack's name (or a set of names) that occur i=
n the expression. Each step requires all packs mentioned to have the same l=
ength, but separate steps may have different lengths. Only those packs are =
expanded in each step which are listed, the result is another pack of expre=
ssions which contain unexpanded packs which are then expanded by the second=
 ellipsis. The above therefore yields (e1). Complete list:

return f(g(Xs<T, Ts>{}...[Ts])...); // generates (e1)
return f(g(Xs<T, Ts>{}...[Xs])...); // generates (e2)
return f(g(Xs<T, Ts>{}...[Ts]...)); // generates (e3)
return f(g(Xs<T, Ts>{}...[Xs]...)); // generates (e4)

But this is probably material for a second proposal and I haven't really th=
ought it through - it's just an idea. Unless everyone thinks it's a brillia=
nt idea and should be part of my proposal right now :-P

-- Daniel

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/EDAC6E5E-EC6A-48FB-964B-3CB6424962F7%40gmx.de.

--Apple-Mail=_85107863-674D-4C1F-8235-E99F59F4760C
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename=signature.asc
Content-Type: application/pgp-signature;
 name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iEYEARECAAYFAlbl2zYACgkQAUxJbew56yHeJQCfdO2DItljCj+Oz75PIduYb6PH
hLkAoLMFgDWw/tDohXCjstcEhbADlk+J
=HnYr
-----END PGP SIGNATURE-----

--Apple-Mail=_85107863-674D-4C1F-8235-E99F59F4760C--

.


Author: Daniel Frey <d.frey@gmx.de>
Date: Sun, 13 Mar 2016 22:46:08 +0100
Raw View
--Apple-Mail=_45B49C11-8F26-4F64-8F2D-A1FB31AEED7C
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8

> On 10.03.2016, at 01:42, barry.revzin@gmail.com wrote:
>=20
> I am a fan of simply allowing pattern...[I], but the rest of the proposal=
 strikes me as maybe wanting to solve the wrong problem? It does make writi=
ng something like apply easier, but it'd be even easier if I could just do:
>=20
>     template <class F, class Tuple>
>     decltype(auto) apply(F&& f, Tuple&& tuple) {
>         return forward<F>(f)(forward<Tuple>(tuple)...);
>     }
>=20
> I'm not sure what rules you'd have to create in order to allow for the di=
rect unpacking of tuple, but I think that's what we're going to want to do =
to improve pack fundamentals. Unpacking the tuple just makes sense. All the=
 other std::get<> and index_sequence stuff is a workaround for not being ab=
le to do that.

It is an interesting idea, but I don't feel it is fundamental for handling =
packs. Instead it as applying the ellipsis to an expression which contain *=
no* packs. I think we are currently wrapping too many things into std::tupl=
e when most of the time we'd like to handle packs directly. Unpacking a tup=
le is therefore, in my mind at least, trying to solve to wrong problem. It =
might still be worth as an additional feature to look into (maybe via an "o=
perator..."), but it'll create a lot of headaches when an expression which =
is followed by an ellipsis contains both packs and object with an "operator=
....".

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/042378A6-966D-4254-A7A7-75F295F3DAE3%40gmx.de.

--Apple-Mail=_45B49C11-8F26-4F64-8F2D-A1FB31AEED7C
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename=signature.asc
Content-Type: application/pgp-signature;
 name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iEYEARECAAYFAlbl36AACgkQAUxJbew56yF5lwCgxNL8SGIKdPQ3mfbRRJVm8p4N
O10AnR5vDRCrvhoI0q1v3Dt2kfRhFPsN
=XIoX
-----END PGP SIGNATURE-----

--Apple-Mail=_45B49C11-8F26-4F64-8F2D-A1FB31AEED7C--

.


Author: inkwizytoryankes@gmail.com
Date: Sun, 13 Mar 2016 17:03:38 -0700 (PDT)
Raw View
------=_Part_3700_1326613414.1457913818971
Content-Type: multipart/alternative;
 boundary="----=_Part_3701_1714801656.1457913818971"

------=_Part_3701_1714801656.1457913818971
Content-Type: text/plain; charset=UTF-8



On Sunday, March 13, 2016 at 10:27:21 PM UTC+1, Daniel Frey wrote:
>
> > On 13.03.2016, at 20:32, inkwizyt...@gmail.com <javascript:> wrote:
> >> On Sunday, March 13, 2016 at 3:59:58 PM UTC+1, Daniel Frey wrote:
> >> > On 13.03.2016, at 15:54, Daniel Frey <d.f...@gmx.de> wrote:
> >> >
> >> >> template<typename T, typename X>
> >> >> using Xs = T... X::pack; // using "Name" = "Category" "Value";
> >> >
> >> > This would be a major problem, exactly what I tried to avoid. The
> usage could otherwise be an expression like
> >> >
> >> >  template<typename... Ts> void bar() { return f(g(Xs<Ts>{}...)...; }
>  // return ???
> >>
> >> That should be
> >>
> >>   template<typename T, typename... Ts>
> >>   void bar()
> >>   {
> >>     return f(g(Xs<T, Ts>{}...)...);
> >>   }
> >>
> >> but you get the idea... :)
> >
> > `Xs` is pack and can be expand only once. First `...` apply to `Xs` not
> to `Ts`. This mean `Xs<T, Ts>` is invalid because `Ts` is not expand.
>
> Ts as also a pack. This is not defined by todays C++, hence you are
> expressing an idea you have, not a current reality. Other options exist of
> what the above could mean in the future. No option is the right one, it is
> a choice.
>
>
Right, this should be "Part 2" of this proposition.


> > I think it should work like:
> >
> > return f(g(Xs<T, Ts...>{}...));
>
> This would be unambiguous. Let's say Xs = {A,B,C}, Ts = {int,long}:
>
> return f(g(Xs<T, Ts...>{}...));
> return f(g(Xs<T, int, long>{}...));
> return f(g(A<T, int, long>{}, B<T, int, long>{}, C<T, int, long>{}));
>
> > return f(g(Xs<T, Ts...>{})...);
>
> return f(g(Xs<T, Ts...>{}...));
> return f(g(Xs<T, int, long>{}...));
> return f(g(A<T, int, long>{}, g(B<T, int, long>{}), g(C<T, int,
> long>{})));
>
> OK, how do you expand to:
>
> return f(g(A<T, int>{}, A<T, long>{}), g(B<T, int>{}, B<T, long>{}),
> g(C<T, int>{}, C<T, long>{})); // (e1)
>
> or
>
> return f(g(A<T, int>{}, B<T, int>{}, C<T, int>{}), g(A<T, long>{}, B<T,
> long>{}, C<T, long>{})); // (e2)
>
> or
>
> return f(g(A<T, int>{}, A<T, long>{}, B<T, int>{}, B<T, long>{}, C<T,
> int>{}, C<T, long>{})); // (e3)
>
> or
>
> return f(g(A<T, int>{}, B<T, int>{}, C<T, int>{}, A<T, long>{}, B<T,
> long>{}, C<T, long>{})); // (e4)
>
>
You can't because you want have pack of packs (one is for `g` another is
for `f` in case e1).


> > As we see this is only one expansion. To have second one, I think we
> would need pack of pack to handle it:
>
> And this is one of the things I'd like to avoid: Creating a pack of packs
> (and by induction a pack of packs of packs, etc.). It means creating new
> entities that don't exist today in a compiler's backend. The complexity to
> implement a proposal which does something like that is much higher and the
> risk of introducing new bugs makes it less likely that a proposal will be
> accepted.
>
> Anyways, if you *really* want to do something like this I think it makes
> much more sense to have "partial expansion" something like:
>
> return f(g(Xs<T, Ts>{}...[Ts])...); // generates (e1)
>                       ^^^^^^^
> possible syntax when the brackets don't contain an integral constant as in
> my proposal (1), but instead a pack's name (or a set of names) that occur
> in the expression. Each step requires all packs mentioned to have the same
> length, but separate steps may have different lengths. Only those packs are
> expanded in each step which are listed, the result is another pack of
> expressions which contain unexpanded packs which are then expanded by the
> second ellipsis. The above therefore yields (e1). Complete list:
>
> return f(g(Xs<T, Ts>{}...[Ts])...); // generates (e1)
> return f(g(Xs<T, Ts>{}...[Xs])...); // generates (e2)
> return f(g(Xs<T, Ts>{}...[Ts]...)); // generates (e3)
> return f(g(Xs<T, Ts>{}...[Xs]...)); // generates (e4)
>
> But this is probably material for a second proposal and I haven't really
> thought it through - it's just an idea. Unless everyone thinks it's a
> brilliant idea and should be part of my proposal right now :-P
>
> -- Daniel
>

Partial expand is interesting, this will easy creating packs of packs of
packs of... :) Because this is new functionality (similar to my version but
implicit) will have probably similar implementation complexity.
For now I think you should stick to current functionality of template packs.

From another mail:


> It is an interesting idea, but I don't feel it is fundamental for handling
> packs. Instead it as applying the ellipsis to an expression which contain
> *no* packs. I think we are currently wrapping too many things into
> std::tuple when most of the time we'd like to handle packs directly.
> Unpacking a tuple is therefore, in my mind at least, trying to solve to
> wrong problem. It might still be worth as an additional feature to look
> into (maybe via an "operator..."), but it'll create a lot of headaches when
> an expression which is followed by an ellipsis contains both packs and
> object with an "operator...".


With templated packs, expanding tuples would be easy:

template<typename Tuple>
using Expand = typename... Tuple::pack; //of if tuple don't have we can
crate helper template that will extract parameter pack from tuple

return f(forward<Expand<Tuple>>(tuple)...); //`Expand<Tuple>` is pack that
can be expanded by `...`





--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/2fda2753-d67a-46a9-b129-a390d7e9d5e3%40isocpp.org.

------=_Part_3701_1714801656.1457913818971
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Sunday, March 13, 2016 at 10:27:21 PM UTC+1, Da=
niel Frey wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin=
-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">&gt; On 13.03.=
2016, at 20:32, <a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-ma=
ilto=3D"0diDdInpBwAJ" rel=3D"nofollow" onmousedown=3D"this.href=3D&#39;java=
script:&#39;;return true;" onclick=3D"this.href=3D&#39;javascript:&#39;;ret=
urn true;">inkwizyt...@gmail.com</a> wrote:
<br>&gt;&gt; On Sunday, March 13, 2016 at 3:59:58 PM UTC+1, Daniel Frey wro=
te:
<br>&gt;&gt; &gt; On 13.03.2016, at 15:54, Daniel Frey &lt;<a>d.f...@gmx.de=
</a>&gt; wrote:
<br>&gt;&gt; &gt;
<br>&gt;&gt; &gt;&gt; template&lt;typename T, typename X&gt;
<br>&gt;&gt; &gt;&gt; using Xs =3D T... X::pack; // using &quot;Name&quot; =
=3D &quot;Category&quot; &quot;Value&quot;;
<br>&gt;&gt; &gt;
<br>&gt;&gt; &gt; This would be a major problem, exactly what I tried to av=
oid. The usage could otherwise be an expression like
<br>&gt;&gt; &gt;
<br>&gt;&gt; &gt; =C2=A0template&lt;typename... Ts&gt; void bar() { return =
f(g(Xs&lt;Ts&gt;{}...)...; } =C2=A0// return ???
<br>&gt;&gt;=20
<br>&gt;&gt; That should be
<br>&gt;&gt;=20
<br>&gt;&gt; =C2=A0 template&lt;typename T, typename... Ts&gt;
<br>&gt;&gt; =C2=A0 void bar()
<br>&gt;&gt; =C2=A0 {
<br>&gt;&gt; =C2=A0 =C2=A0 return f(g(Xs&lt;T, Ts&gt;{}...)...);
<br>&gt;&gt; =C2=A0 }
<br>&gt;&gt;=20
<br>&gt;&gt; but you get the idea... :)
<br>&gt;=20
<br>&gt; `Xs` is pack and can be expand only once. First `...` apply to `Xs=
` not to `Ts`. This mean `Xs&lt;T, Ts&gt;` is invalid because `Ts` is not e=
xpand.
<br>
<br>Ts as also a pack. This is not defined by todays C++, hence you are exp=
ressing an idea you have, not a current reality. Other options exist of wha=
t the above could mean in the future. No option is the right one, it is a c=
hoice.
<br>
<br></blockquote><div><br>Right, this should be &quot;Part 2&quot; of this =
proposition. <br>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"mar=
gin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">&=
gt; I think it should work like:
<br>&gt;=20
<br>&gt; return f(g(Xs&lt;T, Ts...&gt;{}...));
<br>
<br>This would be unambiguous. Let&#39;s say Xs =3D {A,B,C}, Ts =3D {int,lo=
ng}:
<br>
<br>return f(g(Xs&lt;T, Ts...&gt;{}...));
<br>return f(g(Xs&lt;T, int, long&gt;{}...));
<br>return f(g(A&lt;T, int, long&gt;{}, B&lt;T, int, long&gt;{}, C&lt;T, in=
t, long&gt;{}));
<br>
<br>&gt; return f(g(Xs&lt;T, Ts...&gt;{})...);
<br>
<br>return f(g(Xs&lt;T, Ts...&gt;{}...));
<br>return f(g(Xs&lt;T, int, long&gt;{}...));
<br>return f(g(A&lt;T, int, long&gt;{}, g(B&lt;T, int, long&gt;{}), g(C&lt;=
T, int, long&gt;{})));
<br>
<br>OK, how do you expand to:
<br>
<br>return f(g(A&lt;T, int&gt;{}, A&lt;T, long&gt;{}), g(B&lt;T, int&gt;{},=
 B&lt;T, long&gt;{}), g(C&lt;T, int&gt;{}, C&lt;T, long&gt;{})); // (e1)
<br>
<br>or
<br>
<br>return f(g(A&lt;T, int&gt;{}, B&lt;T, int&gt;{}, C&lt;T, int&gt;{}), g(=
A&lt;T, long&gt;{}, B&lt;T, long&gt;{}, C&lt;T, long&gt;{})); // (e2)
<br>
<br>or
<br>
<br>return f(g(A&lt;T, int&gt;{}, A&lt;T, long&gt;{}, B&lt;T, int&gt;{}, B&=
lt;T, long&gt;{}, C&lt;T, int&gt;{}, C&lt;T, long&gt;{})); // (e3)
<br>
<br>or
<br>
<br>return f(g(A&lt;T, int&gt;{}, B&lt;T, int&gt;{}, C&lt;T, int&gt;{}, A&l=
t;T, long&gt;{}, B&lt;T, long&gt;{}, C&lt;T, long&gt;{})); // (e4)
<br>
<br></blockquote><div><br>You can&#39;t because you want have pack of packs=
 (one is for `g` another is for `f` in case e1).<br>=C2=A0</div><blockquote=
 class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1=
px #ccc solid;padding-left: 1ex;">&gt; As we see this is only one expansion=
.. To have second one, I think we would need pack of pack to handle it:
<br>
<br>And this is one of the things I&#39;d like to avoid: Creating a pack of=
 packs (and by induction a pack of packs of packs, etc.). It means creating=
 new entities that don&#39;t exist today in a compiler&#39;s backend. The c=
omplexity to implement a proposal which does something like that is much hi=
gher and the risk of introducing new bugs makes it less likely that a propo=
sal will be accepted.
<br>
<br>Anyways, if you *really* want to do something like this I think it make=
s much more sense to have &quot;partial expansion&quot; something like:
<br>
<br>return f(g(Xs&lt;T, Ts&gt;{}...[Ts])...); // generates (e1)
<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 ^^^^^^^
<br>possible syntax when the brackets don&#39;t contain an integral constan=
t as in my proposal (1), but instead a pack&#39;s name (or a set of names) =
that occur in the expression. Each step requires all packs mentioned to hav=
e the same length, but separate steps may have different lengths. Only thos=
e packs are expanded in each step which are listed, the result is another p=
ack of expressions which contain unexpanded packs which are then expanded b=
y the second ellipsis. The above therefore yields (e1). Complete list:
<br>
<br>return f(g(Xs&lt;T, Ts&gt;{}...[Ts])...); // generates (e1)
<br>return f(g(Xs&lt;T, Ts&gt;{}...[Xs])...); // generates (e2)
<br>return f(g(Xs&lt;T, Ts&gt;{}...[Ts]...)); // generates (e3)
<br>return f(g(Xs&lt;T, Ts&gt;{}...[Xs]...)); // generates (e4)
<br>
<br>But this is probably material for a second proposal and I haven&#39;t r=
eally thought it through - it&#39;s just an idea. Unless everyone thinks it=
&#39;s a brilliant idea and should be part of my proposal right now :-P
<br>
<br>-- Daniel <br></blockquote><div><br>Partial expand is interesting, this=
 will easy creating packs of=20
packs of packs of... :) Because this is new functionality (similar to my
 version but implicit) will have probably similar implementation=20
complexity.<br>For now I think you should stick to current functionality of=
 template packs.<br><br>From another mail:<br>=C2=A0</div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #cc=
c solid;padding-left: 1ex;">
It is an interesting idea, but I don&#39;t feel it is fundamental for=20
handling packs. Instead it as applying the ellipsis to an expression=20
which contain *no* packs. I think we are currently wrapping too many=20
things into std::tuple when most of the time we&#39;d like to handle packs=
=20
directly. Unpacking a tuple is therefore, in my mind at least, trying to
 solve to wrong problem. It might still be worth as an additional=20
feature to look into (maybe via an &quot;operator...&quot;), but it&#39;ll =
create a=20
lot of headaches when an expression which is followed by an ellipsis=20
contains both packs and object with an &quot;operator...&quot;.
</blockquote><div><br>With templated packs, expanding tuples would be easy:=
<br><br><div class=3D"prettyprint" style=3D"background-color: rgb(250, 250,=
 250); border-color: rgb(187, 187, 187); border-style: solid; border-width:=
 1px; word-wrap: break-word;"><code class=3D"prettyprint"><div class=3D"sub=
prettyprint"><span style=3D"color: #008;" class=3D"styled-by-prettify">temp=
late</span><span style=3D"color: #660;" class=3D"styled-by-prettify">&lt;</=
span><span style=3D"color: #008;" class=3D"styled-by-prettify">typename</sp=
an><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span =
style=3D"color: #606;" class=3D"styled-by-prettify">Tuple</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">&gt;</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"><br></span><span style=3D"color: #=
008;" class=3D"styled-by-prettify">using</span><span style=3D"color: #000;"=
 class=3D"styled-by-prettify"> </span><span style=3D"color: #606;" class=3D=
"styled-by-prettify">Expand</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">=3D</span><span style=3D"color: #000;" class=3D"styled-by-prettify"=
> </span><span style=3D"color: #008;" class=3D"styled-by-prettify">typename=
</span><span style=3D"color: #660;" class=3D"styled-by-prettify">...</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span sty=
le=3D"color: #606;" class=3D"styled-by-prettify">Tuple</span><span style=3D=
"color: #660;" class=3D"styled-by-prettify">::</span><span style=3D"color: =
#000;" class=3D"styled-by-prettify">pack</span><span style=3D"color: #660;"=
 class=3D"styled-by-prettify">;</span><span style=3D"color: #000;" class=3D=
"styled-by-prettify"> </span><span style=3D"color: #800;" class=3D"styled-b=
y-prettify">//of if tuple don&#39;t have we can crate helper template that =
will extract parameter pack from tuple</span><span style=3D"color: #000;" c=
lass=3D"styled-by-prettify"><br><br></span><span style=3D"color: #008;" cla=
ss=3D"styled-by-prettify">return</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> f</span><span style=3D"color: #660;" class=3D"styl=
ed-by-prettify">(</span><span style=3D"color: #000;" class=3D"styled-by-pre=
ttify">forward</span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">&lt;</span><span style=3D"color: #606;" class=3D"styled-by-prettify">Ex=
pand</span><span style=3D"color: #660;" class=3D"styled-by-prettify">&lt;</=
span><span style=3D"color: #606;" class=3D"styled-by-prettify">Tuple</span>=
<span style=3D"color: #660;" class=3D"styled-by-prettify">&gt;&gt;(</span><=
span style=3D"color: #000;" class=3D"styled-by-prettify">tuple</span><span =
style=3D"color: #660;" class=3D"styled-by-prettify">)...);</span><span styl=
e=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"colo=
r: #800;" class=3D"styled-by-prettify">//`Expand&lt;Tuple&gt;` is pack that=
 can be expanded by `...`<br></span><code class=3D"prettyprint"><span style=
=3D"color: #606;" class=3D"styled-by-prettify"></span></code><br></div></co=
de></div><br><br><br><br></div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/2fda2753-d67a-46a9-b129-a390d7e9d5e3%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/2fda2753-d67a-46a9-b129-a390d7e9d5e3=
%40isocpp.org</a>.<br />

------=_Part_3701_1714801656.1457913818971--
------=_Part_3700_1326613414.1457913818971--

.


Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Sun, 13 Mar 2016 18:24:31 -0700
Raw View
--001a113dcc8289c998052df8242f
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

On Sun, Mar 13, 2016 at 5:44 AM, Daniel Frey <d.frey@gmx.de> wrote:
>
> > On 06.03.2016, at 19:55, Arthur O'Dwyer <arthur.j.odwyer@gmail.com>
wrote:
> >
> > > > In the part of my post that you snipped, I indicated that
"generating an unexpanded
> > > > parameter pack" is a liability, not an advantage. You seemed to
agree ("Good catch
> > > > ... I'll reconsider that one ...").  Maybe I should say is
currently a liability. It would be
> > > > awesome to have first-class parameter packs, but I think there are
deep problems
> > > > someone needs to solve before we can get them.
> > >
> > > When I said =E2=80=9CGood catch=E2=80=9D I meant that you spotted a p=
roblem that I
haven=E2=80=99t realized
> > > before. It=E2=80=99s an interesting problem and, of course, it makes =
me
reconsider given that
> > > you, IIUC, raised it in the context of my proposed language addition
3).
> >
> > It also applies to addition (2), because that also turns a non-pack
expression into a (first-class) parameter pack.
>
> I think I now have a solution for the problem you spotted with (2) and
(3), the new proposal (attached) solves this by not allowing in-situ
creation or in-situ access to member packs. In short, I only propose two
new features now:
>
> (1) Pack selection:
>
>   pattern...[I]


(0a) In the intro paragraph, "put in practice" should be "but in practice".

(0b) Same sentence: IMHO the paper would be much stronger if you gave a
couple of examples of compilers "generating inferior code for several
cases", in a footnote or appendix, going all the way down to assembly
output and/or the output of "time clang++ -O2 test.cc", whichever is the
more appropriate.

(0c) You say "Those primitives, together with the existing language,
combine nicely...", but in fact you never show an example that uses both
new features *in combination*. Either you're overstating the dependency
between these two new features, or you're missing a motivating example. My
personal opinion (so far) is that you've made a good case for feature #1,
but I still mistrust feature #2, and I think it's feasible to standardize
#1 without #2. How coupled are they, really?
That said, my newbie impression of the Committee's workings is that it
makes sense to stuff both of your proposals into a single paper, as you're
doing, so that you can get them both considered at once; and if the
Committee says "we like #1 but not #2," then that's fine, just rip #2 out
of the next revision of the paper. :)

(1a) You use the term "integral-constant" without definition. I assume you
mean "*constant-expression*" where the *constant-expression* is constrained
to be of integral type, i.e. an "*integral constant expression*" per *N4567
5.20 [expr.const]/3*.

"An *integral constant expression* is an expression of integral or unscoped
enumeration type, implicitly converted to a prvalue, where the converted
expression is a core constant expression. [ *Note:* Such expressions may be
used as array bounds (8.3.4, 5.3.4), as bit-field lengths (9.6), as
enumerator initializers if the underlying type is not fixed (7.2), and as
alignments (7.6.2). =E2=80=94 *end note* ]"

This is fine, but I think it pays to be very explicit (by using
super-precise standard terminology) about what you want to happen in weird
corner cases such as pattern
....[my_literal_type_with_constexpr_implicit_conversion_to_size_t()].

> (2) Pack declaration:
>
>    Syntax 1.1: typename... Ts; // empty pack
>    Syntax 1.2: typename... Ts =3D int, void, double&&;
>    Syntax 1.3: using typename... Ts =3D my_class<int>::types; // access
pack member, this can not be templated
>    Syntax 2.1: std::size_t... Vs; // empty pack
>    Syntax 2.2: std::size_t... Vs =3D 3, 0, 1, 42;
>    Syntax 2.3: using std::size_t... Vs =3D my_class<int>::values;
>    Syntax 2.4: std::size_t... Vs =3D ... 4; // yields 0, 1, 2, 3


(2a) If I understand correctly, Syntax 1.1 makes Ts a pack of size zero,
i.e., is_same_v<tuple<Ts...>, tuple<>>, is that right? That strikes me as a
bit confusing, compared to picking a syntax that admits some explicitly
"empty" syntactic element, such as typename... Ts<>;.

(2b) I don't understand Syntax 1.3 (described in your paper as *using
typename...* Ts =3D *class* :: *pack*;). What kind of entity is pack in thi=
s
context? Aren't you quietly introducing a new kind of C++ entity, i.e. what
I've been calling a "naked pack" or "first-class pack"? I think I can
smuggle my usual double-... into this feature.

template<int I> struct A {
    using typename... ints =3D int, int, int;  // this is Syntax 1.2, right=
?
};

template<int I> void f1() {
    using typename... Ts =3D A<I>::ints;  // this is Syntax 1.3, right?
    std::tuple<Ts...> t;
}

template<int I> void f2() {
    std::tuple<A<I>::ints ...> t;  // same as f1, just inlined
}

template<int... Is> void f3() {
    std::tuple<A<Is>::ints ... ...> t;  // boom?
}

(2c) I think you've successfully locked down the syntax for Pack
Declarations to the point where there's no grammatical ambiguity, but it's
too arbitrary for my personal taste. How come I can write

    int Alpha =3D 0, Beta =3D 1;

but I can't write

    int... Alphas =3D 0, 1, Betas =3D 2, 3;
    // or should it really be:
    int ...Alphas =3D 0, 1, ...Betas =3D 2, 3;

I mean, obviously that would introduce grammatical ambiguity; but by
locking out the ambiguity, you've also lost some symmetry with the existing
language =E2=80=94 lost too much for my taste.

One counterargument to that point would be: C++ has lots of syntactic
"freedoms" like that for purely historical reasons. Modern style would
never declare two different variables on the same line. Declarations
like typedef
int i, *p, a[10]; wouldn't pass code review in 2016. Therefore, modern
additions to the language *quite properly* lock down the syntax wherever
they can. For example, when new-style type aliases were introduced in
C++11, we got

    using i =3D int;
    using p =3D int *;
    using a =3D int[10];

but we pointedly did *not* get

    using i =3D int, p =3D int *, a =3D int[10];  // try it; it doesn't com=
pile

So this new declaration syntax *quite properly* doesn't replicate the
historical mistakes of C.

This counterargument would put the burden back on naysayers like me to come
up with an example of improperly-locked-out grammar that doesn't look so
much like a "historical mistake of C." :)

my $.02,
Arthur

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/CADvuK0K%3DAWbDQFsPXDxF_Rozggy74AzYOCvih0EWhj7gf=
rFeUQ%40mail.gmail.com.

--001a113dcc8289c998052df8242f
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">On Sun, Mar 13, 2016 at 5:44 AM, Daniel Frey &lt;<a href=
=3D"mailto:d.frey@gmx.de">d.frey@gmx.de</a>&gt; wrote:<br>&gt;<br>&gt; &gt;=
 On 06.03.2016, at 19:55, Arthur O&#39;Dwyer &lt;<a href=3D"mailto:arthur.j=
..odwyer@gmail.com">arthur.j.odwyer@gmail.com</a>&gt; wrote:<br>&gt; &gt;<br=
>&gt; &gt; &gt; &gt; In the part of my post that you snipped, I indicated t=
hat &quot;generating an unexpanded<br>&gt; &gt; &gt; &gt; parameter pack&qu=
ot; is a liability, not an advantage. You seemed to agree (&quot;Good catch=
<br>&gt; &gt; &gt; &gt; ... I&#39;ll reconsider that one ...&quot;).=C2=A0 =
Maybe I should say is currently a liability. It would be<br>&gt; &gt; &gt; =
&gt; awesome to have first-class parameter packs, but I think there are dee=
p problems<br>&gt; &gt; &gt; &gt; someone needs to solve before we can get =
them.<br>&gt; &gt; &gt;<br>&gt; &gt; &gt; When I said =E2=80=9CGood catch=
=E2=80=9D I meant that you spotted a problem that I haven=E2=80=99t realize=
d<br>&gt; &gt; &gt; before. It=E2=80=99s an interesting problem and, of cou=
rse, it makes me reconsider given that<br>&gt; &gt; &gt; you, IIUC, raised =
it in the context of my proposed language addition 3).<br>&gt; &gt;<br>&gt;=
 &gt; It also applies to addition (2), because that also turns a non-pack e=
xpression into a (first-class) parameter pack.<br>&gt;<br>&gt; I think I no=
w have a solution for the problem you spotted with (2) and (3), the new pro=
posal (attached) solves this by not allowing in-situ creation or in-situ ac=
cess to member packs. In short, I only propose two new features now:<br>&gt=
;<br>&gt; (1) Pack selection:<br>&gt;<br>&gt; =C2=A0 pattern...[I]<br><br><=
br>(0a) In the intro paragraph, &quot;put in practice&quot; should be &quot=
;but in practice&quot;.<br><br>(0b) Same sentence: IMHO the paper would be =
much stronger if you gave a couple of examples of compilers &quot;generatin=
g inferior code for several cases&quot;, in a footnote or appendix, going a=
ll the way down to assembly output and/or the output of &quot;time clang++ =
-O2 test.cc&quot;, whichever is the more appropriate.<br><br>(0c) You say &=
quot;Those primitives, together with the existing language, combine nicely.=
...&quot;, but in fact you never show an example that uses both new features=
 <i>in combination</i>. Either you&#39;re overstating the dependency betwee=
n these two new features, or you&#39;re missing a motivating example. My pe=
rsonal opinion (so far) is that you&#39;ve made a good case for feature #1,=
 but I still mistrust feature #2, and I think it&#39;s feasible to standard=
ize #1 without #2. How coupled are they, really?<br>That said, my newbie im=
pression of the Committee&#39;s workings is that it makes sense to stuff bo=
th of your proposals into a single paper, as you&#39;re doing, so that you =
can get them both considered at once; and if the Committee says &quot;we li=
ke #1 but not #2,&quot; then that&#39;s fine, just rip #2 out of the next r=
evision of the paper. :)<br><br>(1a) You use the term &quot;integral-consta=
nt&quot; without definition. I assume you mean &quot;<i>constant-expression=
</i>&quot; where the <i>constant-expression</i> is constrained to be of int=
egral type, i.e. an &quot;<i>integral constant expression</i>&quot; per <b>=
N4567 5.20 [expr.const]/3</b>. <br><br>&quot;An <i>integral constant expres=
sion</i> is an expression of integral or unscoped enumeration type, implici=
tly converted to a prvalue, where the converted expression is a core consta=
nt expression. [ <i>Note:</i> Such expressions may be used as array bounds =
(8.3.4, 5.3.4), as bit-field lengths (9.6), as enumerator initializers if t=
he underlying type is not fixed (7.2), and as alignments (7.6.2). =E2=80=94=
 <i>end note</i> ]&quot;<br><br>This is fine, but I think it pays to be ver=
y explicit (by using super-precise standard terminology) about what you wan=
t to happen in weird corner cases such as <font face=3D"monospace, monospac=
e">pattern ...[my_literal_type_with_constexpr_implicit_conversion_to_size_t=
()]</font>.<br><br>&gt; (2) Pack declaration:<br>&gt;<br>&gt; =C2=A0 =C2=A0=
Syntax 1.1: typename... Ts; // empty pack<br>&gt; =C2=A0 =C2=A0Syntax 1.2: =
typename... Ts =3D int, void, double&amp;&amp;;<br>&gt; =C2=A0 =C2=A0Syntax=
 1.3: using typename... Ts =3D my_class&lt;int&gt;::types; // access pack m=
ember, this can not be templated<br>&gt; =C2=A0 =C2=A0Syntax 2.1: std::size=
_t... Vs; // empty pack<br>&gt; =C2=A0 =C2=A0Syntax 2.2: std::size_t... Vs =
=3D 3, 0, 1, 42;<br>&gt; =C2=A0 =C2=A0Syntax 2.3: using std::size_t... Vs =
=3D my_class&lt;int&gt;::values;<br>&gt; =C2=A0 =C2=A0Syntax 2.4: std::size=
_t... Vs =3D ... 4; // yields 0, 1, 2, 3<br><br><br>(2a) If I understand co=
rrectly, Syntax 1.1 makes Ts a pack of size zero, i.e., <font face=3D"monos=
pace, monospace">is_same_v&lt;tuple&lt;Ts...&gt;, tuple&lt;&gt;&gt;</font>,=
 is that right? That strikes me as a bit confusing, compared to picking a s=
yntax that admits some explicitly &quot;empty&quot; syntactic element, such=
 as <font face=3D"monospace, monospace">typename... Ts&lt;&gt;;</font>.<br>=
<br>(2b) I don&#39;t understand Syntax 1.3 (described in your paper as <fon=
t face=3D"monospace, monospace"><b>using typename...</b> Ts =3D <i>class</i=
> :: <i>pack</i>;</font>). What kind of entity is pack in this context? Are=
n&#39;t you quietly introducing a new kind of C++ entity, i.e. what I&#39;v=
e been calling a &quot;naked pack&quot; or &quot;first-class pack&quot;? I =
think I can smuggle my usual double-<font face=3D"monospace, monospace">...=
</font> into this feature.<br><br><font face=3D"monospace, monospace">templ=
ate&lt;int I&gt; struct A {<br>=C2=A0 =C2=A0 using typename... ints =3D int=
, int, int; =C2=A0// this is Syntax 1.2, right?<br>};<br><br>template&lt;in=
t I&gt; void f1() {<br>=C2=A0 =C2=A0 using typename... Ts =3D A&lt;I&gt;::i=
nts; =C2=A0// this is Syntax 1.3, right?<br>=C2=A0 =C2=A0 std::tuple&lt;Ts.=
...&gt; t;<br>}<br><br>template&lt;int I&gt; void f2() {<br>=C2=A0 =C2=A0 st=
d::tuple&lt;A&lt;I&gt;::ints ...&gt; t; =C2=A0// same as f1, just inlined<b=
r>}<br><br>template&lt;int... Is&gt; void f3() {<br>=C2=A0 =C2=A0 std::tupl=
e&lt;A&lt;Is&gt;::ints ... ...&gt; t; =C2=A0// boom?<br>}</font><br><br>(2c=
) I think you&#39;ve successfully locked down the syntax for Pack Declarati=
ons to the point where there&#39;s no grammatical ambiguity, but it&#39;s t=
oo arbitrary for my personal taste. How come I can write<br><br><font face=
=3D"monospace, monospace">=C2=A0 =C2=A0 int Alpha =3D 0, Beta =3D 1;<br></f=
ont><br>but I can&#39;t write<br><br><font face=3D"monospace, monospace">=
=C2=A0 =C2=A0 int... Alphas =3D 0, 1, Betas =3D 2, 3;<br>=C2=A0 =C2=A0 // o=
r should it really be:<br>=C2=A0 =C2=A0 int ...Alphas =3D 0, 1, ...Betas =
=3D 2, 3;<br></font><br>I mean, obviously that would introduce grammatical =
ambiguity; but by locking out the ambiguity, you&#39;ve also lost some symm=
etry with the existing language =E2=80=94 lost too much for my taste.<br><b=
r>One counterargument to that point would be: C++ has lots of syntactic &qu=
ot;freedoms&quot; like that for purely historical reasons. Modern style wou=
ld never declare two different variables on the same line. Declarations lik=
e <font face=3D"monospace, monospace">typedef int i, *p, a[10];</font> woul=
dn&#39;t pass code review in 2016. Therefore, modern additions to the langu=
age <i>quite properly</i> lock down the syntax wherever they can. For examp=
le, when new-style type aliases were introduced in C++11, we got<br><br><fo=
nt face=3D"monospace, monospace">=C2=A0 =C2=A0 using i =3D int;<br>=C2=A0 =
=C2=A0 using p =3D int *;<br>=C2=A0 =C2=A0 using a =3D int[10];<br></font><=
br>but we pointedly did <i>not</i> get<br><br><font face=3D"monospace, mono=
space">=C2=A0 =C2=A0 using i =3D int, p =3D int *, a =3D int[10]; =C2=A0// =
try it; it doesn&#39;t compile<br></font><br>So this new declaration syntax=
 <i>quite properly</i> doesn&#39;t replicate the historical mistakes of C.<=
br><br>This counterargument would put the burden back on naysayers like me =
to come up with an example of improperly-locked-out grammar that doesn&#39;=
t look so much like a &quot;historical mistake of C.&quot; :)<br><br>my $.0=
2,<br>Arthur</div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CADvuK0K%3DAWbDQFsPXDxF_Rozggy74AzYOC=
vih0EWhj7gfrFeUQ%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0K%3DAWbD=
QFsPXDxF_Rozggy74AzYOCvih0EWhj7gfrFeUQ%40mail.gmail.com</a>.<br />

--001a113dcc8289c998052df8242f--

.


Author: Matthew Woehlke <mwoehlke.floss@gmail.com>
Date: Mon, 14 Mar 2016 14:34:42 -0400
Raw View
On 2016-03-13 08:44, Daniel Frey wrote:
> (1) Pack selection:
>
>   pattern...[I]

Doesn't this already have a defined meaning (`pattern<0>[I],
pattern<1>[I], ...`)?

Please explain why `[I]pack` is objectionable.

Too many people have conflicting ideas in this area. We should be
working *together* towards a single, unified vision, not operating in a
vacuum.

--
Matthew

--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/nc7082%24p34%241%40ger.gmane.org.

.


Author: Barry Revzin <barry.revzin@gmail.com>
Date: Mon, 14 Mar 2016 18:38:24 +0000
Raw View
--001a11402a248973f6052e0696e4
Content-Type: text/plain; charset=UTF-8

No, that would be pattern[I]...

Putting the index first means that indexing into a parameter pack would
have backwards syntax from indexing into anything else in the language.
That's objectionable.

On Mon, Mar 14, 2016, 1:35 PM Matthew Woehlke <mwoehlke.floss@gmail.com>
wrote:

> On 2016-03-13 08:44, Daniel Frey wrote:
> > (1) Pack selection:
> >
> >   pattern...[I]
>
> Doesn't this already have a defined meaning (`pattern<0>[I],
> pattern<1>[I], ...`)?
>
> Please explain why `[I]pack` is objectionable.
>
> Too many people have conflicting ideas in this area. We should be
> working *together* towards a single, unified vision, not operating in a
> vacuum.
>
> --
> Matthew
>
> --
> You received this message because you are subscribed to a topic in the
> Google Groups "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/a/isocpp.org/d/topic/std-proposals/ajLcDl8GbpA/unsubscribe
> .
> To unsubscribe from this group and all its topics, send an email to
> std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> To view this discussion on the web visit
> https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/nc7082%24p34%241%40ger.gmane.org
> .
>

--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CACS8nvdDEZ3_z%3D0hS3BDMbpSEYGiXwMjwr7egE0GEJf6svW8MA%40mail.gmail.com.

--001a11402a248973f6052e0696e4
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<p dir=3D"ltr">No, that would be pattern[I]...</p>
<p dir=3D"ltr">Putting the index first means that indexing into a parameter=
 pack would have backwards syntax from indexing into anything else in the l=
anguage. That&#39;s objectionable.</p>
<br><div class=3D"gmail_quote"><div dir=3D"ltr">On Mon, Mar 14, 2016, 1:35 =
PM=C2=A0Matthew Woehlke &lt;<a href=3D"mailto:mwoehlke.floss@gmail.com">mwo=
ehlke.floss@gmail.com</a>&gt; wrote:<br></div><blockquote class=3D"gmail_qu=
ote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex=
">On 2016-03-13 08:44, Daniel Frey wrote:<br>
&gt; (1) Pack selection:<br>
&gt;<br>
&gt;=C2=A0 =C2=A0pattern...[I]<br>
<br>
Doesn&#39;t this already have a defined meaning (`pattern&lt;0&gt;[I],<br>
pattern&lt;1&gt;[I], ...`)?<br>
<br>
Please explain why `[I]pack` is objectionable.<br>
<br>
Too many people have conflicting ideas in this area. We should be<br>
working *together* towards a single, unified vision, not operating in a<br>
vacuum.<br>
<br>
--<br>
Matthew<br>
<br>
--<br>
You received this message because you are subscribed to a topic in the Goog=
le Groups &quot;ISO C++ Standard - Future Proposals&quot; group.<br>
To unsubscribe from this topic, visit <a href=3D"https://groups.google.com/=
a/isocpp.org/d/topic/std-proposals/ajLcDl8GbpA/unsubscribe" rel=3D"noreferr=
er" target=3D"_blank">https://groups.google.com/a/isocpp.org/d/topic/std-pr=
oposals/ajLcDl8GbpA/unsubscribe</a>.<br>
To unsubscribe from this group and all its topics, send an email to <a href=
=3D"mailto:std-proposals%2Bunsubscribe@isocpp.org" target=3D"_blank">std-pr=
oposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/nc7082%24p34%241%40ger.gmane.org" rel=
=3D"noreferrer" target=3D"_blank">https://groups.google.com/a/isocpp.org/d/=
msgid/std-proposals/nc7082%24p34%241%40ger.gmane.org</a>.<br>
</blockquote></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CACS8nvdDEZ3_z%3D0hS3BDMbpSEYGiXwMjwr=
7egE0GEJf6svW8MA%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CACS8nvdDEZ3_z%=
3D0hS3BDMbpSEYGiXwMjwr7egE0GEJf6svW8MA%40mail.gmail.com</a>.<br />

--001a11402a248973f6052e0696e4--

.


Author: Matthew Woehlke <mwoehlke.floss@gmail.com>
Date: Mon, 14 Mar 2016 14:52:29 -0400
Raw View
(Please trim-post: http://www.palmyanoff.com/trimpost.htm)

On 2016-03-14 14:38, Barry Revzin wrote:
> On Mon, Mar 14, 2016, 1:35 PM Matthew Woehlke wrote:
>> On 2016-03-13 08:44, Daniel Frey wrote:
>>> (1) Pack selection:
>>>
>>>   pattern...[I]
>>
>> Doesn't this already have a defined meaning (`pattern<0>[I],
>> pattern<1>[I], ...`)?
>>
>> Please explain why `[I]pack` is objectionable.
>>
>> Too many people have conflicting ideas in this area. We should be
>> working *together* towards a single, unified vision, not operating in a
>> vacuum.
>
> No, that would be pattern[I]...
>
> Putting the index first means that indexing into a parameter pack would
> have backwards syntax from indexing into anything else in the language.
> That's objectionable.

It also *works with non-packs* (and is less typing). *I* object to
adding two new syntaxes where one would do (see last comment in my
previous message).

Demonstrate a rational manner to incorporate slicing, tuple-unpacking,
and operation on non-packs with the proposed syntax and I will withdraw
the objection. Prefix indexing supports all of these features.

--
Matthew

--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/nc719e%24g3g%241%40ger.gmane.org.

.


Author: Daniel Frey <d.frey@gmx.de>
Date: Mon, 14 Mar 2016 21:37:36 +0100
Raw View
--Apple-Mail=_B9182D22-BE44-47C0-A74F-EA5EC295AE9E
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8

> On 14.03.2016, at 19:52, Matthew Woehlke <mwoehlke.floss@gmail.com> wrote=
:
>=20
> On 2016-03-14 14:38, Barry Revzin wrote:
>> On Mon, Mar 14, 2016, 1:35 PM Matthew Woehlke wrote:
>>> On 2016-03-13 08:44, Daniel Frey wrote:
>>>> (1) Pack selection:
>>>>=20
>>>>  pattern...[I]
>>>=20
>>> Doesn't this already have a defined meaning (`pattern<0>[I],
>>> pattern<1>[I], ...`)?
>>>=20
>>> Please explain why `[I]pack` is objectionable.
>>>=20
>>> Too many people have conflicting ideas in this area. We should be
>>> working *together* towards a single, unified vision, not operating in a
>>> vacuum.
>>=20
>> No, that would be pattern[I]...

Correct, and currently an ellipsis can never be followed by an opening squa=
re bracket so that syntax was available.

>> Putting the index first means that indexing into a parameter pack would
>> have backwards syntax from indexing into anything else in the language.
>> That's objectionable.

Another strong point, thanks Barry.

To me, [I]pack is also extremely unintuitive.

A technical problem I can see is, that it also raises problems with

// Is =3D 0, 2, 1, 3
// Ps =3D tuple<int, double, float, unsigned>, tuple<...>, tuple<...>, tupl=
e<...>

[Is]Ps{}... // ??? now what?

If your prefix syntax may also index into non-packs, what does the above do=
? Expand Is first, then Ps? Ps first, then Is? Both in parallel?

> It also *works with non-packs* (and is less typing). *I* object to
> adding two new syntaxes where one would do (see last comment in my
> previous message).

What you see as an advantage, I consider a problem. The syntax doesn't help=
 me to read my code. I chose the ellipsis to be part of all the things I pr=
opose to make sure you can always immediately spot places where a parameter=
 pack is involved. I might just think that different things are important, =
different features should be provided or avoided and I have a different tas=
te of syntax. I think that what I propose would be an important feature to =
improve compile-times, I think your additional features might be implementa=
ble as a library - but I haven't looked in detail. I am doing this in my (l=
imited) spare time, so I can not look at everyone's favorite proposal. I lo=
oked at some, talked to some people and I am open to reasonable discussions=
 and suggestions, but so far you haven't written anything that I found conv=
incing.

> Demonstrate a rational manner to incorporate slicing, tuple-unpacking,
> and operation on non-packs with the proposed syntax and I will withdraw
> the objection. Prefix indexing supports all of these features.

No. I don't have to. You want those features, not me.

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/76A57512-D9C8-46A7-842C-8F43BB502D48%40gmx.de.

--Apple-Mail=_B9182D22-BE44-47C0-A74F-EA5EC295AE9E
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename=signature.asc
Content-Type: application/pgp-signature;
 name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iEYEARECAAYFAlbnIRAACgkQAUxJbew56yHCngCggIlzx0xwOB/vwuagnmv2IoQB
6gwAn35VZcycgM2uir5Avk/oRMcmkFkk
=iX9k
-----END PGP SIGNATURE-----

--Apple-Mail=_B9182D22-BE44-47C0-A74F-EA5EC295AE9E--

.


Author: Daniel Frey <d.frey@gmx.de>
Date: Mon, 14 Mar 2016 21:53:17 +0100
Raw View
--Apple-Mail=_2DA2C0F8-04F2-40DE-8DB4-FD9058C1097C
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8

> On 14.03.2016, at 01:03, inkwizytoryankes@gmail.com wrote:
>=20
>> Ts as also a pack. This is not defined by todays C++, hence you are expr=
essing an idea you have, not a current reality. Other options exist of what=
 the above could mean in the future. No option is the right one, it is a ch=
oice.
>=20
> Right, this should be "Part 2" of this proposition.

> Partial expand is interesting, this will easy creating packs of packs of =
packs of... :) Because this is new functionality (similar to my version but=
 implicit) will have probably similar implementation complexity.

That is probably true. Creating packs of packs [of packs...] would be a lot=
 of work, especially if "pack" also stands for more complex expressions.

> For now I think you should stick to current functionality of template pac=
ks.

I agree :) The "Part 2" is too much for now and I don't see a conflict with=
 my current proposal, so it could still be added later as it's own proposal=
..

> From another mail:
>=20
>> It is an interesting idea, but I don't feel it is fundamental for handli=
ng packs. Instead it as applying the ellipsis to an expression which contai=
n *no* packs. I think we are currently wrapping too many things into std::t=
uple when most of the time we'd like to handle packs directly. Unpacking a =
tuple is therefore, in my mind at least, trying to solve to wrong problem. =
It might still be worth as an additional feature to look into (maybe via an=
 "operator..."), but it'll create a lot of headaches when an expression whi=
ch is followed by an ellipsis contains both packs and object with an "opera=
tor...".
>>=20
> With templated packs, expanding tuples would be easy:
>=20
> template<typename Tuple>
> using Expand =3D typename... Tuple::pack; //of if tuple don't have we can=
 crate helper template that will extract parameter pack from tuple

Note that this is not part of what I'm proposing. The using syntax in my pr=
oposal for packs does explicitly not allow to be templated, otherwise the s=
ame problem with nested packs and the expansion will come up again.

-- Daniel

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/AFA50C91-F455-4B0C-9771-63E1B916FB20%40gmx.de.

--Apple-Mail=_2DA2C0F8-04F2-40DE-8DB4-FD9058C1097C
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename=signature.asc
Content-Type: application/pgp-signature;
 name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iEYEARECAAYFAlbnJL0ACgkQAUxJbew56yGjmwCcCE0lG18y0NIEN1MXngbBZUKH
uzYAoMtTzcmP75Lnbo+b0Nr6LSH8yuXv
=C6fU
-----END PGP SIGNATURE-----

--Apple-Mail=_2DA2C0F8-04F2-40DE-8DB4-FD9058C1097C--

.


Author: Daniel Frey <d.frey@gmx.de>
Date: Mon, 14 Mar 2016 22:26:18 +0100
Raw View
--Apple-Mail=_91D0EACA-EC60-4A1B-A281-8FD9B36625C3
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8

> On 14.03.2016, at 02:24, Arthur O'Dwyer <arthur.j.odwyer@gmail.com> wrote=
:
>=20
> On Sun, Mar 13, 2016 at 5:44 AM, Daniel Frey <d.frey@gmx.de> wrote:
> >
> > I think I now have a solution for the problem you spotted with (2) and =
(3), the new proposal (attached) solves this by not allowing in-situ creati=
on or in-situ access to member packs. In short, I only propose two new feat=
ures now:
> >
> > (1) Pack selection:
> >
> >   pattern...[I]
>=20
> (0a) In the intro paragraph, "put in practice" should be "but in practice=
".

Fixed, thanks.

> (0b) Same sentence: IMHO the paper would be much stronger if you gave a c=
ouple of examples of compilers "generating inferior code for several cases"=
, in a footnote or appendix, going all the way down to assembly output and/=
or the output of "time clang++ -O2 test.cc", whichever is the more appropri=
ate.

I'll try to come up with better examples, providing hard numbers might be a=
 problem since I can not provide the code with my proposal implemented.

> (0c) You say "Those primitives, together with the existing language, comb=
ine nicely...", but in fact you never show an example that uses both new fe=
atures in combination. Either you're

I meant that they combine overall. In some places you need (1), in others (=
2). Applied in all the places where possible, the code becomes shorter, mor=
e direct and creates much fewer instances. I know I can only give you my wo=
rd right now, but this is my experience from implementing tao::tuple, some =
code in the company as well as lots of answer I gave on StackOverflow. The =
same patterns come up time and again and it always feels indirect and ineff=
icient to use the traditional work-arounds. tao::tuple showed me how much c=
an be gained by avoiding unnecessary instantiations and I think my proposal=
 has a lot of potential to further improve the situation.

For the run-time part: I've seen people that were writing Lua-wrappers in C=
++ to generate very inefficient code because the compiler was creating too =
many instantiations. There was nothing in theory that would prevent the com=
piler from producing optimal code, but the reality is that compilers have t=
heir limits. My experience also tells me that with more direct code, it bec=
omes *much* more likely that the compiler will generate optimal code.

Finally, (2) is useful whenever you use make_integer_sequence just to pass =
it on into some second function/method where it is immediately used to dedu=
ce a parameter pack. In my database framework (not yet public), I also modi=
fy the indices, then pass them on again just to deduce the results. The sch=
eme is so common that I would really like to express myself more directly w=
ith (2).

> (1a) You use the term "integral-constant" without definition. I assume yo=
u mean "constant-expression" where the constant-expression is constrained t=
o be of integral type, i.e. an "integral constant expression" per N4567 5.2=
0 [expr.const]/3.

You are probably right, I was mostly just using it as a descriptive placeho=
lder. But when I do so and create the impression that this is taken from th=
e standard, then it better be right (or I explain it). I will have to put s=
ome serious time into the proposals wording, rationale, ... - but my time i=
s currently also quite limited.

> This is fine, but I think it pays to be very explicit (by using super-pre=
cise standard terminology) about what you want to happen in weird corner ca=
ses such as pattern ...[my_literal_type_with_constexpr_implicit_conversion_=
to_size_t()].

Intersting case, I can't tell you whether I'd like to support that right no=
w :)

> > (2) Pack declaration:
> >
> >    Syntax 1.1: typename... Ts; // empty pack
> >    Syntax 1.2: typename... Ts =3D int, void, double&&;
> >    Syntax 1.3: using typename... Ts =3D my_class<int>::types; // access=
 pack member, this can not be templated
> >    Syntax 2.1: std::size_t... Vs; // empty pack
> >    Syntax 2.2: std::size_t... Vs =3D 3, 0, 1, 42;
> >    Syntax 2.3: using std::size_t... Vs =3D my_class<int>::values;
> >    Syntax 2.4: std::size_t... Vs =3D ... 4; // yields 0, 1, 2, 3
>=20
> (2a) If I understand correctly, Syntax 1.1 makes Ts a pack of size zero, =
i.e., is_same_v<tuple<Ts...>, tuple<>>, is that right? That strikes me as a=
 bit confusing, compared to picking a syntax that admits some explicitly "e=
mpty" syntactic element, such as typename... Ts<>;.

Yes, I also though about that. It's just that I couldn't come up with somet=
hing more convincing.

int... Ts =3D {}; // Ambiguous. Empty pack or a pack with one element initi=
alized with {}? Even if we define it, users might confuse it.
int... Ts =3D <>;
int... Ts =3D ();
int... Ts =3D [];
int... Ts =3D default;

Nothing really convinces me. OTOH, I also entertained the idea of:

int... Is<>; // empty
int... Is<0, 1, 2, 3>; // 4 elements
int... Is<...4>; // generate 4 elements as above
int... Js<2*Is+1...>; // transform 4 elements

(likewise for types if applicable)

> (2b) I don't understand Syntax 1.3 (described in your paper as using type=
name... Ts =3D class :: pack;). What kind of entity is pack in this context=
? Aren't you quietly introducing a new kind of C++ entity, i.e. what I've b=
een calling a "naked pack" or "first-class pack"? I think I can smuggle my =
usual double-... into this feature.

It is a pack define by the above syntax in the scope of some class/class te=
mplate. But I do not propose that the syntax allows to be templated and I d=
o not propose that any other kind of access is allowed. class::pack may onl=
y be accessed via the proposed syntax. In my newest proposal version, I cha=
nged 1.3 and 2.3 into a new point (3) separate from (2) and simplified it t=
o:

  using... Ps =3D class::pack;

as the type of the pack is already known, no need to repeat it. Any referen=
ce to class::pack anywhere else is an error. Hence:

> template<int I> void f1() {
>     using typename... Ts =3D A<I>::ints;  // this is Syntax 1.3, right?
>     std::tuple<Ts...> t;
> }

Yes, OK.

> template<int I> void f2() {
>     std::tuple<A<I>::ints ...> t;  // same as f1, just inlined
> }

Already an error as described above.

> template<int... Is> void f3() {
>     std::tuple<A<Is>::ints ... ...> t;  // boom?
> }

I saw it coming and the above restriction makes sure this is avoided :)

> (2c) I think you've successfully locked down the syntax for Pack Declarat=
ions to the point where there's no grammatical ambiguity, but it's too arbi=
trary for my personal taste. How come I can write
>=20
>     int Alpha =3D 0, Beta =3D 1;
>=20
> but I can't write
>=20
>     int... Alphas =3D 0, 1, Betas =3D 2, 3;
>     // or should it really be:
>     int ...Alphas =3D 0, 1, ...Betas =3D 2, 3;
>=20
> I mean, obviously that would introduce grammatical ambiguity; but by lock=
ing out the ambiguity, you've also lost some symmetry with the existing lan=
guage =E2=80=94 lost too much for my taste.

I don't think I personally would like to support

   int... Alphas =3D 0, 1, ...Betas =3D 2, 3;

but it is certainly possible.

> One counterargument to that point would be: C++ has lots of syntactic "fr=
eedoms" like that for purely historical reasons. Modern style would never d=
eclare two different variables on the same line. Declarations like typedef =
int i, *p, a[10]; wouldn't pass code review in 2016. Therefore, modern addi=
tions to the language quite properly lock down the syntax wherever they can=
.. For example, when new-style type aliases were introduced in C++11, we got
>=20
>     using i =3D int;
>     using p =3D int *;
>     using a =3D int[10];
>=20
> but we pointedly did not get
>=20
>     using i =3D int, p =3D int *, a =3D int[10];  // try it; it doesn't c=
ompile
>=20
> So this new declaration syntax quite properly doesn't replicate the histo=
rical mistakes of C.

I agree that we should learn from past mistakes and only allow a single pac=
k declaration per statement.

> This counterargument would put the burden back on naysayers like me to co=
me up with an example of improperly-locked-out grammar that doesn't look so=
 much like a "historical mistake of C." :)

:)

I don't want to exclude reasonable syntax or extensions for no good reason,=
 but especially you have made me quite cautious - and for very good reasons=
.. It is quite easy to screw up expressions and how they are expanded when y=
ou don't keep a close control over what is allowed and in which context. I =
hope my current proposal does not leak any of those problems into other par=
ts of the language while still providing enough expressiveness to cover all=
 the low-level cases that are currently only implementable with costly work=
-arounds.

-- Daniel

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/F8533DEA-16AC-4B8D-B9B1-C85826824EE2%40gmx.de.

--Apple-Mail=_91D0EACA-EC60-4A1B-A281-8FD9B36625C3
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename=signature.asc
Content-Type: application/pgp-signature;
 name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iEYEARECAAYFAlbnLHoACgkQAUxJbew56yEDagCeN+LXjZ/MulkubFP4v6ThhjHN
4L8An317sYLSpUPvlwjlqyMQpfenzyIG
=uf1T
-----END PGP SIGNATURE-----

--Apple-Mail=_91D0EACA-EC60-4A1B-A281-8FD9B36625C3--

.


Author: Matthew Woehlke <mwoehlke.floss@gmail.com>
Date: Mon, 14 Mar 2016 17:50:24 -0400
Raw View
On 2016-03-14 16:37, Daniel Frey wrote:
> On 14.03.2016, at 19:52, Matthew Woehlke wrote:
>> On Mon, Mar 14, 2016, 1:35 PM Matthew Woehlke wrote:
>>> On 2016-03-13 08:44, Daniel Frey wrote:
>>>> (1) Pack selection:
>>>>
>>>>  pattern...[I]
>>>
>>> Doesn't this already have a defined meaning (`pattern<0>[I],
>>> pattern<1>[I], ...`)?
>>>
>>> Please explain why `[I]pack` is objectionable.
>
> To me, [I]pack is also extremely unintuitive.
>
> A technical problem I can see is, that it also raises problems with
>
> // Is = 0, 2, 1, 3
> // Ps = tuple<int, double, float, unsigned>, tuple<...>, tuple<...>, tuple<...>
>
> [Is]Ps{}... // ??? now what?
>
> If your prefix syntax may also index into non-packs, what does the
> above do? Expand Is first, then Ps? Ps first, then Is? Both in parallel?

I'm not convinced that your syntax solves this (or, alternatively, that
mine can't solve it equally well). (I'm *also* not convinced that using
packs for indices is a good idea. That seems like a great way to create
illegible code. Daveed's pack generators would probably do this in a
much more readable manner.)

>> It also *works with non-packs* (and is less typing). *I* object to
>> adding two new syntaxes where one would do (see last comment in my
>> previous message).
>
> What you see as an advantage, I consider a problem. The syntax
> doesn't help me to read my code. I chose the ellipsis to be part of
> all the things I propose to make sure you can always immediately spot
> places where a parameter pack is involved.

I rather have the opposite reaction... if you're picking out a single
element, why does it *matter* if the input is a parameter pack or not?
In fact, I would go so far as to call this a misfeature. That would be
like saying we should not allow vector::operator[] because the input is
a vector rather than a C-style array.

> I might just think that different things are important, different
> features should be provided or avoided and I have a different taste
> of syntax.

I've heard a lot of people complaining about teachability... IMHO,
consistency is important.

> I think that what I propose would be an important feature to improve
> compile-times

Don't get me wrong; I fully agree that we *want* indexed access to
parameter packs. I only disagree with inventing Yet Another syntactic
construct to do so (that is incompatible with other goals; see later
comments).

> I think your additional features might be
> implementable as a library - but I haven't looked in detail.

I believe that generalized unpacking is not possible without *some* core
language change. There are several possibilities that don't provide the
feature directly, but would make a library solution possible. I still
feel strongly that the aforementioned operations are sufficiently common
to warrant a language feature, *especially* since prefix indexing can
consistently handle a large number of use cases.

Put differently: we need *some* core language change; why not pick the
one that gives us the most utility?

> I am doing this in my (limited) spare time, so I can not look at
> everyone's favorite proposal.

I understand that. That's why we have this forum :-).

> so far you haven't written anything that I found convincing.

We *probably* want generalized unpacking. We *probably* want indexed
access to parameter packs (your proposal notwithstanding, Daveed's
proposal and past proposals make me think that we do). We *may* want (as
a language feature) slicing of tuple-likes and/or parameter packs (we
almost certainly *do* want it, but once could argue if a library
solution is sufficient).

That being the case, let's try this... which do you prefer? (Let `tuple`
be tuple-like and `pack` be a parameter pack)

Option 1:

  auto x = std::get<N>(tuple); // can 'N' be any constexpr?
  foo(std::unpack(tuple));
  foo(std::pp::<2,3>(std::unpack(tuple))); // unpack may be unneeded?
  bar(pack...[N]);
  bar(std::pp::mid<2,3>(<pack>)...);

Option 2:

  auto x = [N]tuple; // definitely takes constexpr for 'N'
  foo([:]tuple...);
  foo([2:3]tuple...);
  bar([N]pack);
  bar([2:3]pack);

Note the consistency, and the simplicity of performing common
operations. (Also note that the second invocation of `foo` in Option 1
is less efficient compared to Option 2.)

This is what I mean by "most utility". Creating new syntax is hard and
results in more things for users to learn (see previous comment re:
teachability). This is *one* syntax that provides *many* features and
works the same in many contexts. Accordingly, it is easier to learn and
easier to specify.

>> Demonstrate a rational manner to incorporate slicing, tuple-unpacking,
>> and operation on non-packs with the proposed syntax and I will withdraw
>> the objection. Prefix indexing supports all of these features.
>
> No. I don't have to. You want those features, not me.

You lost a qualifier there... you "have to" *if* you want me to withdraw
the objection. Otherwise, I continue to object strongly to your proposed
syntax. Certainly, you have the right to ignore that objection. If you
do so, however, it is my intent to present a hostile proposal for prefix
notation.

I'd *prefer* to champion your proposal :-), but I can't conscionably do
over such an objection.

p.s. I wrote a paper that addresses this topic (among others) that I
hope/plan to submit for the next mailing. Here is a relevant excerpt:
"We also urge the committee to consider these issues and how such
features relate (or can be made to relate) to tuple-like objects in
order to maximize consistency of operations on both object types, and we
urge authors working on such proposals to do likewise."

--
Matthew

--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/nc7bn0%24qql%241%40ger.gmane.org.

.


Author: Matthew Woehlke <mwoehlke.floss@gmail.com>
Date: Mon, 14 Mar 2016 18:04:55 -0400
Raw View
On 2016-03-13 08:44, Daniel Frey wrote:
> [updated proposal]

I took a closer look at the other parts of the proposal. I don't find
your examples compelling. Compilers are already implementing constexpr
generation of integer sequences as an intrinsic, and I think that
Daveed's pack generators proposal is far more compelling for such use
cases. For `std::apply`, an even better implementation is:

  template <typename Func, typename Tuple>
  std::apply(Func&& f, Tuple&& t)
  {
    return forward<F>(f)([:]forward<Tuple>(t)...);
  }

....i.e. generalized unpacking (which also relegates use of std::apply to
esoteric uses only).

I suspect you'll need a much stronger rationale to get any traction in EWG.

--
Matthew

--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/nc7ci8%246t8%241%40ger.gmane.org.

.


Author: Matthew Woehlke <mwoehlke.floss@gmail.com>
Date: Mon, 14 Mar 2016 18:27:12 -0400
Raw View
On 2016-03-14 17:26, Daniel Frey wrote:
> On 14.03.2016, at 02:24, Arthur O'Dwyer wrote:
>> On Sun, Mar 13, 2016 at 5:44 AM, Daniel Frey wrote:
>>> (2) Pack declaration:
>>>
>>>    Syntax 1.1: typename... Ts; // empty pack
>>>    Syntax 1.2: typename... Ts =3D int, void, double&&;
>>>    Syntax 1.3: using typename... Ts =3D my_class<int>::types; // access=
 pack member, this can not be templated
>>>    Syntax 2.1: std::size_t... Vs; // empty pack
>>>    Syntax 2.2: std::size_t... Vs =3D 3, 0, 1, 42;
>>>    Syntax 2.3: using std::size_t... Vs =3D my_class<int>::values;
>>>    Syntax 2.4: std::size_t... Vs =3D ... 4; // yields 0, 1, 2, 3
>>
>> (2a) If I understand correctly, Syntax 1.1 makes Ts a pack of size zero,=
 i.e., is_same_v<tuple<Ts...>, tuple<>>, is that right? That strikes me as =
a bit confusing, compared to picking a syntax that admits some explicitly "=
empty" syntactic element, such as typename... Ts<>;.
>=20
> Yes, I also though about that. It's just that I couldn't come up with som=
ething more convincing.

This looks suspiciously like a proposal Mike Spertus is working on...
IIRC he uses <>'s to delineate parameter pack literals. Also, IIRC his
are not limited to integral types. That seems like an unnecessary
limitation.

(Sigh. And this is why I'm writing a paper encouraging people to *talk
to each other*. And I don't mean just Daniel. There is an unfortunate
disconnect between people posting on std-proposals and people actually
going to meetings. Fortunately, there are a few people=C2=B9 that do both,
but I think we'd have less reinventing of the wheel if more of the
people driving the language development paid attention to std-proposals,
and if more of the people throwing up any old thing here did their
homework as to what similar ideas have gone before, especially as
published papers. It would also help if more people didn't skip the
"float your idea past std-proposals" step. I get the feeling this tends
to be the more seasoned committee participants who feel they "don't need
the feedback", which is fair, but on the other hand I think they are to
some extent doing the community a disservice by making it harder for
this group to know what is happening.)

(=C2=B9 Ville, I'm looking at you, appreciatively :-).)

--=20
Matthew

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/nc7ds1%24stq%241%40ger.gmane.org.

.


Author: Daniel Frey <d.frey@gmx.de>
Date: Tue, 15 Mar 2016 17:53:53 +0100
Raw View
--Apple-Mail=_1EE93B5B-18D1-43CA-B350-20FB8DA66F04
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8

> On 14.03.2016, at 22:50, Matthew Woehlke <mwoehlke.floss@gmail.com> wrote=
:
>=20
> On 2016-03-14 16:37, Daniel Frey wrote:
>> On 14.03.2016, at 19:52, Matthew Woehlke wrote:
>>> On Mon, Mar 14, 2016, 1:35 PM Matthew Woehlke wrote:
>>>> On 2016-03-13 08:44, Daniel Frey wrote:
>>>>> (1) Pack selection:
>>>>>=20
>>>>> pattern...[I]
>>>>=20
>>>> Please explain why `[I]pack` is objectionable.
>>=20
>> To me, [I]pack is also extremely unintuitive.
>>=20
>> A technical problem I can see is, that it also raises problems with
>>=20
>> // Is =3D 0, 2, 1, 3
>> // Ps =3D tuple<int, double, float, unsigned>, tuple<...>, tuple<...>, t=
uple<...>
>>=20
>> [Is]Ps{}... // ??? now what?
>>=20
>> If your prefix syntax may also index into non-packs, what does the
>> above do? Expand Is first, then Ps? Ps first, then Is? Both in parallel?
>=20
> I'm not convinced that your syntax solves this (or, alternatively, that
> mine can't solve it equally well). (I'm *also* not convinced that using

Please explain why my proposal would not solve this.

> packs for indices is a good idea. That seems like a great way to create
> illegible code. Daveed's pack generators would probably do this in a
> much more readable manner.)
>=20
>>> It also *works with non-packs* (and is less typing). *I* object to
>>> adding two new syntaxes where one would do (see last comment in my
>>> previous message).
>>=20
>> What you see as an advantage, I consider a problem. The syntax
>> doesn't help me to read my code. I chose the ellipsis to be part of
>> all the things I propose to make sure you can always immediately spot
>> places where a parameter pack is involved.
>=20
> I rather have the opposite reaction... if you're picking out a single
> element, why does it *matter* if the input is a parameter pack or not?
> In fact, I would go so far as to call this a misfeature. That would be
> like saying we should not allow vector::operator[] because the input is
> a vector rather than a C-style array.

Let me provide more rationale for the syntax I've chosen and why I don't li=
ke the syntax you proposed. My main concern is that I don't want any new sy=
ntax, because we already have it: postfix indexing. This is exactly what yo=
u should use to access elements from a tuple t: t[I]. The problem there is =
not the syntax, it's the semantics. Currently, the [I] can not be used to c=
all std::get<I>(t). This is what should be made possible. Also, you may thi=
nk about improving indexing to support slicing, etc. - but I don't see that=
 prefix indexing is required or even desirable.

Now to explain my choice of syntax: Given that we already have a syntax to =
pick an element from something (indexing with [I]), I simply apply the exis=
ting syntax to a pack expansion to only select one element of the expansion=
 (including not even expanding what is not needed). To you have a pattern (=
with pack(s)), expand it with an ellipsis and select an element with [I] - =
et voil=C3=A0: pattern...[I]

Another problem with prefix indexing: The square brackets at the begin of a=
n expression nowadays starts a lambda, with your proposal I need to first r=
ead the rest of the expression to figure out if I look at a lambda or prefi=
x indexing. And have you considered all cases to be unambiguous? Think abou=
t a lambda having [], then some parameters with () and a body with {}. But =
the compile might see {} as just a block scope following a prefix indexed e=
xpression, as () may be part of an expression.

>> I might just think that different things are important, different
>> features should be provided or avoided and I have a different taste
>> of syntax.
>=20
> I've heard a lot of people complaining about teachability... IMHO,
> consistency is important.

I think that my above rationale will also help to teach pattern...[I], I fa=
il to see why it should not be at least as teachable as your proposed synta=
x.

>> I think your additional features might be
>> implementable as a library - but I haven't looked in detail.
>=20
> I believe that generalized unpacking is not possible without *some* core
> language change. There are several possibilities that don't provide the
> feature directly, but would make a library solution possible. I still
> feel strongly that the aforementioned operations are sufficiently common
> to warrant a language feature, *especially* since prefix indexing can
> consistently handle a large number of use cases.
>=20
> Put differently: we need *some* core language change; why not pick the
> one that gives us the most utility?

Because I'd like to improve the language by using existing syntax and provi=
de semantics first. Only the use-cases that can really not be handled like =
this might warrant a new syntax. It seems we agree on the basic idea, but I=
 think I am not convinced that your syntax is needed for most of the use-ca=
ses you'd like to support.

> We *probably* want generalized unpacking. We *probably* want indexed
> access to parameter packs (your proposal notwithstanding, Daveed's
> proposal and past proposals make me think that we do). We *may* want (as
> a language feature) slicing of tuple-likes and/or parameter packs (we
> almost certainly *do* want it, but once could argue if a library
> solution is sufficient).

Some amount of slicing can be build on top of my proposal without further l=
anguage changes. Example:

template<size_t Begin, size_t End, typename... Ts>
class slice
{
  // add static_asserts as needed
  size_t... Is =3D ...End-Begin;
public:
  size_t... values =3D Is+Begin...;
};


template<size_t Begin, size_t End, typename... Ts>
class slice_types
{
  using... Is =3D slice<Begin, End>::values;
public:
  typename... types =3D Ts...[Is]...;
};

And now you can use:

typename... Ts =3D int, double, float, void, unsigned;
using... Us =3D slice_types<1, 3, Ts...>::types; // yields a pack with: dou=
ble, float

(the actual functions and their signature should be improved, but just to s=
how an example of how it would be possible)

> That being the case, let's try this... which do you prefer? (Let `tuple`
> be tuple-like and `pack` be a parameter pack)
>=20
> Option 1:
>=20
>  auto x =3D std::get<N>(tuple); // can 'N' be any constexpr?
>  foo(std::unpack(tuple));
>  foo(std::pp::<2,3>(std::unpack(tuple))); // unpack may be unneeded?
>  bar(pack...[N]);
>  bar(std::pp::mid<2,3>(<pack>)...);
>=20
> Option 2:
>=20
>  auto x =3D [N]tuple; // definitely takes constexpr for 'N'
>  foo([:]tuple...);
>  foo([2:3]tuple...);
>  bar([N]pack);
>  bar([2:3]pack);
>=20
> Note the consistency, and the simplicity of performing common
> operations. (Also note that the second invocation of `foo` in Option 1
> is less efficient compared to Option 2.)

I'd like:

auto x =3D tpl[N];
using... Is =3D tpl::indices;
foo(tpl[Is]...);
using... Js =3D std::slice<2, 3>::values; // in my above example 3 is End, =
but it might also be the Size - depends on how we define it - or offer both=
 with different names :)
foo(tpl[Js]...);
bar(pck...[N]);
bar(pck...[Js]...);

Yes, you sometimes need a line more or two, but I don't think it's too bad.

> This is what I mean by "most utility". Creating new syntax is hard and
> results in more things for users to learn (see previous comment re:
> teachability). This is *one* syntax that provides *many* features and
> works the same in many contexts. Accordingly, it is easier to learn and
> easier to specify.

Which is why I'd like to use the existing syntax of postfix indexing and ap=
ply it in new contexts.

-- Daniel

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/DBCEBA71-9195-4870-A01C-94C8023EBD23%40gmx.de.

--Apple-Mail=_1EE93B5B-18D1-43CA-B350-20FB8DA66F04
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename=signature.asc
Content-Type: application/pgp-signature;
 name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iEYEARECAAYFAlboPiEACgkQAUxJbew56yF6OgCfRaSGxCAqer3vWQ5ys/zIGFvb
K7cAnjy8b2zOC6QAogc3op7hg1iCcZ5N
=2phl
-----END PGP SIGNATURE-----

--Apple-Mail=_1EE93B5B-18D1-43CA-B350-20FB8DA66F04--

.


Author: Matthew Woehlke <mwoehlke.floss@gmail.com>
Date: Tue, 15 Mar 2016 16:57:53 -0400
Raw View
On 2016-03-15 12:53, Daniel Frey wrote:
> On 14.03.2016, at 22:50, Matthew Woehlke wrote:
>> On 2016-03-14 16:37, Daniel Frey wrote:
>>> On Mon, Mar 14, 2016, 1:35 PM Matthew Woehlke wrote:
>>>> On 2016-03-13 08:44, Daniel Frey wrote:
>>>>> (1) Pack selection:
>>>>>
>>>>> pattern...[I]
>>>>
>>>> Please explain why `[I]pack` is objectionable.
>>>
>>> To me, [I]pack is also extremely unintuitive.
>>>
>>> A technical problem I can see is, that it also raises problems with
>>>
>>> // Is =3D 0, 2, 1, 3
>>> // Ps =3D tuple<int, double, float, unsigned>, tuple<...>, tuple<...>, =
tuple<...>
>>>
>>> [Is]Ps{}... // ??? now what?
>>>
>>> If your prefix syntax may also index into non-packs, what does the
>>> above do? Expand Is first, then Ps? Ps first, then Is? Both in parallel=
?

Okay, since you're forcing me to actually *look at* that question :-)...

My short answer to that is 'dealing with packs of packs is hard'. A
"true" solution needs some way to specify which expansions apply to
what. Otherwise, someone will always want to do other than what you wanted.

Possible answer: "greedy"; `[Is]` would bind to indexing the pack `Ps`,
which would leave `Is` as the pack to be expanded by `...`:

  ([0]Ps){}, ([2]Ps){}, ([1]Ps){}, ([3]Ps){}

More likely answer: short of a solution to the larger problem, packs are
not allowed as indices :-).

I tend to think this would be better addressed with a "library" solution
a la Daveed's pack generators. *Lots* more typing, but you'd be able to
decode the result without consulting the specification.

I think my idea handles fewer cases than yours=C2=B9, but in a simpler
manner, while Daveed's pack generators are more complicated than your
idea but also *MUCH* more expressive. Your proposal is somewhere in
between; not quite as simple as mine, but not nearly as expressive as
Daveed's.

(=C2=B9 For this paragraph, I am referring to your parts (2) and (3) and my
slicing, i.e. not pack indexing, which is comparable in both of our ideas.)

>> I'm not convinced that your syntax solves this (or, alternatively, that
>> mine can't solve it equally well). (I'm *also* not convinced that using
>=20
> Please explain why my proposal would not solve this.

http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/25182

Hmm... okay, I guess both can define a "binding order". The not-solved
problem I was thinking about is what to do when you have packs of packs
and need to *control* the binding order. Per the above referenced
message, I don't believe either of us are attempting to address that.

Apologies for the confusion.

> Let me provide more rationale for the syntax I've chosen and why I
> don't like the syntax you proposed. My main concern is that I don't want
> any new syntax, because we already have it: postfix indexing.

Yes, we already have `a[4]` (and it's abominable cousin `4[a]` for bare
pointers). We *don't* have `pack...[N]`. That's *a new syntax*.

> This is exactly what you should use to access elements from a tuple
> t: t[I]. The problem there is not the syntax, it's the semantics.
> Currently, the [I] can not be used to call std::get<I>(t). This is
> what should be made possible.

Do you have a proposal for that? Because I don't. The meaning of that is
already well defined: it invokes operator[]. Which... will never work
for tuple (except perhaps to return a std::any), because what you *want*
is to perform the operation at *compile-time* rather than run-time.

Which... is a great reason for a new and distinctive syntax! It's also a
reason that *you gave* for wanting a new and distinctive syntax.

I submit that prefix index is more than suitable for this purpose; it
clearly indicates that something different from runtime indexing is
occurring, and it can be applied to both tuple-like and parameter pack
indexing (very similar compile-time operations for which consistency
makes sense). The `...[N]` syntax would look very strange applied to a
tuple-like, because `...` implies parameter packs.

> Also, you may think about improving indexing to support slicing, etc.
> - but I don't see that prefix indexing is required or even=20
> desirable.

Prefix indexing:

- Is visually distinct from postfix indexing (*your* reason!)
- Supports indexing, unpacking, and slicing
- Works consistently with both parameter packs and tuple-likes

Yours *definitely* fails the third point, and... okay, you do later show
the second, but it's unacceptably ugly. (More on both those points below.)

That's not to say that I'm wedded to prefix indexing as such, just that
it is quantitatively the best syntax of which I am presently aware. I'm
open to considering something else that can be shown to be equally
versatile or better.

> Another problem with prefix indexing: The square brackets at the
> begin of an expression nowadays starts a lambda, with your proposal I nee=
d to
> first read the rest of the expression to figure out if I look at a
> lambda or prefix indexing.

The first part is true, but hardly the end of the world. The second
part... depends on what you mean by "the rest of the expression". In the
typical case, you will know in a few characters, because either an
integer literal or a `:` will be present.

> And have you considered all cases to be unambiguous?

The worst pathological case I can come up with is:

    constexpr auto i =3D 0;
    auto x =3D [i]{ return 0; };
    auto y =3D [i](tuple);

This still isn't a valid lambda, and I'm unaware of any cases that are
intractably ambiguous.

However, if it seems like a real problem, I'm happy to require that
anything that looks like a lambda up to the closing `]` must actually
*be* a lambda, since there is a trivial solution:

    auto y =3D [(i)]tuple;

This is (AFAIK) unambiguously a compile-time index into `tuple` as of
the `(`.

Most cases are already not ambiguous because the expression is not a
valid capture even without such tricks (especially the common case of an
index that is an integer literal).

> Think about a lambda having [], then some parameters with
> () and a body with {}. But the compile might see {} as just a block
> scope following a prefix indexed expression, as () may be part of an
> expression.

Even if we don't implement the above restriction (in which case you know
by the `]` which you're allowed to have), I still don't see how you
would create an ambiguous case. Either the `]` is directly followed by
an expression of tuple-like type (i.e. no `(` or `{`, so definitely not
a lambda), or the part in `()`s is TTBOMK unambiguously either a
parameter list or a value-expression. (Also... the `{...}` can't be a
block scope; you'd be missing a `;`.)

It's possible I'm mistaken on both points, but I *have* thought about
this, and it will take a counter-example to change my mind.

>> I've heard a lot of people complaining about teachability... IMHO,
>> consistency is important.
>=20
> I think that my above rationale will also help to teach=20
> pattern...[I], I fail to see why it should not be at least as
> teachable as your proposed syntax.

Clarification: I don't disagree that either syntax is equally teachable
*for parameter packs*. The trouble is that your syntax either doesn't
work (see below) or is atrocious (i.e. if we used `tuple...[N]` instead)
for tuple-likes. So we either:

1. Have atrocious syntax for tuple-likes
2. Have different syntax for tuple-likes
3. Use something else for both

(2) is what I was referencing w.r.t. consistency and teachability.

>> We *probably* want generalized unpacking. We *probably* want indexed
>> access to parameter packs (your proposal notwithstanding, Daveed's
>> proposal and past proposals make me think that we do). We *may* want (as
>> a language feature) slicing of tuple-likes and/or parameter packs (we
>> almost certainly *do* want it, but once could argue if a library
>> solution is sufficient).
>=20
> Some amount of slicing can be build on top of my proposal without further=
 language changes. Example:
> [snip example]

Now, *that* is a more compelling example than in your latest draft. Not
more compelling than Daveed's idea, but I'd still encourage you to add
it to your paper.

>> Which do you prefer? (Let `tuple` be tuple-like and `pack` be a
>> parameter pack)
>>=20
>> Option 1:
>>
>>  auto x =3D std::get<N>(tuple); // can 'N' be any constexpr?
>>  foo(std::unpack(tuple));
>>  foo(std::pp::<2,3>(std::unpack(tuple))); // unpack may be unneeded?
>>  bar(pack...[N]);
>>  bar(std::pp::mid<2,3>(<pack>)...);
>>
>> Option 2:
>>
>>  auto x =3D [N]tuple; // definitely takes constexpr for 'N'
>>  foo([:]tuple...);
>>  foo([2:3]tuple...);
>>  bar([N]pack);
>>  bar([2:3]pack);
>=20
> I'd like:
>=20
> auto x =3D tpl[N];

Impossible. This already has meaning: run-time indexing. You *might* be
able to twist the language sufficiently to make this mean compile time
indexing *for std::tuple*, but not for types that already have a
run-time `operator[]`, e.g. std::array (which is also tuple-like).

> using... Is =3D tpl::indices;
> foo(tpl[Is]...);

*Might* be possible, but the syntax is very, very scary (per previous
comment). It's also unacceptably much typing. My main use case is for
code like:

  auto p =3D get_point();
  use([:]p...);
  // replaces:
  //   use(p[0], p[1], p[2])
  // -or-
  //   use(p.x(), p.y(), p.z())

If I have to type that mess that you show, it defeats the purpose by
being significantly more complicated than what I was trying to avoid in
the first place. (Oh, and you didn't show how it would work on a
tuple-*like*. I expect you could use some form of library function, but
it would end up even worse than what you showed.)

Assuming I could inline the definition of `Is`, I *might* be able to use
your form... in a macro. Ugh. No, thanks.

--=20
Matthew

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/nc9t0i%24dav%241%40ger.gmane.org.

.


Author: inkwizytoryankes@gmail.com
Date: Wed, 16 Mar 2016 12:27:03 -0700 (PDT)
Raw View
------=_Part_83_2118075569.1458156423914
Content-Type: multipart/alternative;
 boundary="----=_Part_84_1409964265.1458156423915"

------=_Part_84_1409964265.1458156423915
Content-Type: text/plain; charset=UTF-8



On Monday, March 14, 2016 at 9:53:20 PM UTC+1, Daniel Frey wrote:
>
> > On 14.03.2016, at 01:03, inkwizyt...@gmail.com <javascript:> wrote:
> >
> >>
> > With templated packs, expanding tuples would be easy:
> >
> > template<typename Tuple>
> > using Expand = typename... Tuple::pack; //of if tuple don't have we can
> crate helper template that will extract parameter pack from tuple
>
> Note that this is not part of what I'm proposing. The using syntax in my
> proposal for packs does explicitly not allow to be templated, otherwise the
> same problem with nested packs and the expansion will come up again.
>
> -- Daniel
>
>
Today I think about this and I come to conclusion that you will not avoid
this problems even when banning templated packs.
Consider template:
template<typename... T>
struct X
{
    using... Ts = T;
};

template<typename... Z>
auto Y()
{
    return F(X<Z>::Ts{}...); //exactly same situation like `Tp<Z>` where
`Tp` is templated pack.
};
We have two solution:
a) ban usage of packs that depends on unexpanded packs e.g.
`X<Z...>::Ts...` is valid but `X<Z>::Ts...` is invalid.
b) allow multi stage expansion of packs. `g(f(X<Z>::Ts...)...)` where first
`...` is expanding `Z` and second set of dot expand rest. Partial step will
be `g(f(X<Z1>::Ts, X<Z2>::Ts, X<Z3>::Ts)...)`.

I think you will not able to run from "packs of packs". I you allow that
pack can be defined in structure than you can have something like that:
template<typename... T>
void f()
{
    g(T::pack...); //each of `T` have member pack definition `typename...
pack = int, long;`
}

this will probably need `typename... T::pack` similar to `typename T::type`
too.

--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/3c1ccf16-7622-4ab8-b984-d550d233b197%40isocpp.org.

------=_Part_84_1409964265.1458156423915
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Monday, March 14, 2016 at 9:53:20 PM UTC+1, Dan=
iel Frey wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-=
left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">&gt; On 14.03.2=
016, at 01:03, <a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-mai=
lto=3D"WNDYyUI2CAAJ" rel=3D"nofollow" onmousedown=3D"this.href=3D&#39;javas=
cript:&#39;;return true;" onclick=3D"this.href=3D&#39;javascript:&#39;;retu=
rn true;">inkwizyt...@gmail.com</a> wrote:
<br>&gt;=20
<br>&gt;&gt;=20
<br>&gt; With templated packs, expanding tuples would be easy:
<br>&gt;=20
<br>&gt; template&lt;typename Tuple&gt;
<br>&gt; using Expand =3D typename... Tuple::pack; //of if tuple don&#39;t =
have we can crate helper template that will extract parameter pack from tup=
le
<br>
<br>Note that this is not part of what I&#39;m proposing. The using syntax =
in my proposal for packs does explicitly not allow to be templated, otherwi=
se the same problem with nested packs and the expansion will come up again.
<br>
<br>-- Daniel
<br>
<br></blockquote><div><br>Today I think about this and I come to conclusion=
 that you will not avoid this problems even when banning templated packs.<b=
r>Consider template:<br><div class=3D"prettyprint" style=3D"background-colo=
r: rgb(250, 250, 250); border-color: rgb(187, 187, 187); border-style: soli=
d; border-width: 1px; word-wrap: break-word;"><code class=3D"prettyprint"><=
div class=3D"subprettyprint"><span style=3D"color: #008;" class=3D"styled-b=
y-prettify">template</span><span style=3D"color: #660;" class=3D"styled-by-=
prettify">&lt;</span><span style=3D"color: #008;" class=3D"styled-by-pretti=
fy">typename</span><span style=3D"color: #660;" class=3D"styled-by-prettify=
">...</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> T</s=
pan><span style=3D"color: #660;" class=3D"styled-by-prettify">&gt;</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span st=
yle=3D"color: #008;" class=3D"styled-by-prettify">struct</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> X<br></span><span style=3D"=
color: #660;" class=3D"styled-by-prettify">{</span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify"><br>=C2=A0 =C2=A0 </span><span style=3D"c=
olor: #008;" class=3D"styled-by-prettify">using</span><span style=3D"color:=
 #660;" class=3D"styled-by-prettify">...</span><span style=3D"color: #000;"=
 class=3D"styled-by-prettify"> </span><span style=3D"color: #606;" class=3D=
"styled-by-prettify">Ts</span><span style=3D"color: #000;" class=3D"styled-=
by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">=3D</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> T<=
/span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</span><sp=
an style=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span sty=
le=3D"color: #660;" class=3D"styled-by-prettify">};</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"><br><br></span><span style=3D"colo=
r: #008;" class=3D"styled-by-prettify">template</span><span style=3D"color:=
 #660;" class=3D"styled-by-prettify">&lt;</span><span style=3D"color: #008;=
" class=3D"styled-by-prettify">typename</span><span style=3D"color: #660;" =
class=3D"styled-by-prettify">...</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> Z</span><span style=3D"color: #660;" class=3D"styl=
ed-by-prettify">&gt;</span><span style=3D"color: #000;" class=3D"styled-by-=
prettify"><br></span><span style=3D"color: #008;" class=3D"styled-by-pretti=
fy">auto</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> Y=
</span><span style=3D"color: #660;" class=3D"styled-by-prettify">()</span><=
span style=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span s=
tyle=3D"color: #660;" class=3D"styled-by-prettify">{</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"><br>=C2=A0 =C2=A0 </span><span st=
yle=3D"color: #008;" class=3D"styled-by-prettify">return</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> F</span><span style=3D"colo=
r: #660;" class=3D"styled-by-prettify">(</span><span style=3D"color: #000;"=
 class=3D"styled-by-prettify">X</span><span style=3D"color: #660;" class=3D=
"styled-by-prettify">&lt;</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify">Z</span><span style=3D"color: #660;" class=3D"styled-by-pret=
tify">&gt;::</span><span style=3D"color: #606;" class=3D"styled-by-prettify=
">Ts</span><span style=3D"color: #660;" class=3D"styled-by-prettify">{}...)=
;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><=
span style=3D"color: #800;" class=3D"styled-by-prettify">//exactly same sit=
uation like `Tp&lt;Z&gt;` where `Tp` is templated pack.</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span style=3D"co=
lor: #660;" class=3D"styled-by-prettify">};</span><span style=3D"color: #00=
0;" class=3D"styled-by-prettify"><br></span></div></code></div>We have two =
solution:<br>a) ban usage of packs that depends on unexpanded packs e.g. `X=
&lt;Z...&gt;::Ts...` is valid but `X&lt;Z&gt;::Ts...` is invalid.<br>b) all=
ow multi stage expansion of packs. `g(f(X&lt;Z&gt;::Ts...)...)` where first=
 `...` is expanding `Z` and second set of dot expand rest. Partial step wil=
l be `g(f(X&lt;Z1&gt;::Ts, X&lt;Z2&gt;::Ts, X&lt;Z3&gt;::Ts)...)`.<br><br>I=
 think you will not able to run from &quot;packs of packs&quot;. I you allo=
w that pack can be defined in structure than you can have something like th=
at:<br><div class=3D"prettyprint" style=3D"background-color: rgb(250, 250, =
250); border-color: rgb(187, 187, 187); border-style: solid; border-width: =
1px; word-wrap: break-word;"><code class=3D"prettyprint"><div class=3D"subp=
rettyprint"><span style=3D"color: #008;" class=3D"styled-by-prettify">templ=
ate</span><span style=3D"color: #660;" class=3D"styled-by-prettify">&lt;</s=
pan><span style=3D"color: #008;" class=3D"styled-by-prettify">typename</spa=
n><span style=3D"color: #660;" class=3D"styled-by-prettify">...</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"co=
lor: #000;" class=3D"styled-by-prettify"><br></span><span style=3D"color: #=
008;" class=3D"styled-by-prettify">void</span><span style=3D"color: #000;" =
class=3D"styled-by-prettify"> f</span><span style=3D"color: #660;" class=3D=
"styled-by-prettify">()</span><span style=3D"color: #000;" class=3D"styled-=
by-prettify"><br></span><span style=3D"color: #660;" class=3D"styled-by-pre=
ttify">{</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><b=
r>=C2=A0 =C2=A0 g</span><span style=3D"color: #660;" class=3D"styled-by-pre=
ttify">(</span><span style=3D"color: #000;" class=3D"styled-by-prettify">T<=
/span><span style=3D"color: #660;" class=3D"styled-by-prettify">::</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify">pack</span><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify">...);</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color=
: #800;" class=3D"styled-by-prettify">//each of `T` have member pack defini=
tion `typename... pack =3D int, long;`</span><span style=3D"color: #000;" c=
lass=3D"styled-by-prettify"><br></span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">}</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify"><br><br></span></div></code></div>this will probably need `t=
ypename... T::pack` similar to `typename T::type` too.<br><br></div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/3c1ccf16-7622-4ab8-b984-d550d233b197%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/3c1ccf16-7622-4ab8-b984-d550d233b197=
%40isocpp.org</a>.<br />

------=_Part_84_1409964265.1458156423915--
------=_Part_83_2118075569.1458156423914--

.


Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Wed, 16 Mar 2016 13:00:19 -0700
Raw View
--001a113d5d26a4ca26052e2ff69a
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

On Wed, Mar 16, 2016 at 12:27 PM,  <inkwizytoryankes@gmail.com> wrote:
> On Monday, March 14, 2016 at 9:53:20 PM UTC+1, Daniel Frey wrote:
>> On 14.03.2016, at 01:03, inkwizyt...@gmail.com wrote:
>> >
>> > template<typename Tuple>
>> > using Expand =3D typename... Tuple::pack; //of if tuple don't have we =
can
>> > crate helper template that will extract parameter pack from tuple
>>
>> Note that this is not part of what I'm proposing. The using syntax in my
>> proposal for packs does explicitly not allow to be templated, otherwise
the
>> same problem with nested packs and the expansion will come up again.
>
> Today I think about this and I come to conclusion that you will not avoid
> this problems even when banning templated packs.
> Consider template:
> template<typename... T>
> struct X
> {
>     using... Ts =3D T;
> };
>
> template<typename... Z>
> auto Y()
> {
>     return F(X<Z>::Ts{}...); //exactly same situation like `Tp<Z>` where
> `Tp` is templated pack.
> };

My understanding (from Daniel's reply to my most recent post) is that
Daniel would ban expressions like the above.
He'd allow "naked packs" to be used *only* in using... declarations.

template<typename... T> struct X {
    using... Ts =3D T;  // OK
};
template<typename Y, typename... Z> auto Y() {
    using... MyTs1 =3D X<Y>::Ts;  // OK
    using... MyTs2 =3D X<Z>::Ts;  // Error: contains an unexpanded paramete=
r
pack
    using... MyTs3 =3D X<Z>::Ts...;  // Error: can't apply "..." to a patte=
rn
containing a naked parameter pack
    F(X<Y>::Ts{}...);  // Error: can't do anything with a naked parameter
pack except make a pack alias for it
    F(MyTs1{}...);  // OK
}

I don't think there are any exploitable holes in it, if it's locked down to
that extent. But I do think that Daniel needs to get some actual
Standardese wording for what you can and can't do with naked packs, before
it will be *obvious* whether there are no holes. His current phrase ("the
using syntax... does not allow to be templated") is clearly not clear
enough. :)

=E2=80=93Arthur

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/CADvuK0LtMAiBZn-2i2BvWFb%3DC6L8j91%2BndFOeDQ6ax%=
2Bb-hLJ0w%40mail.gmail.com.

--001a113d5d26a4ca26052e2ff69a
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">On Wed, Mar 16, 2016 at 12:27 PM, =C2=A0&lt;<a href=3D"mai=
lto:inkwizytoryankes@gmail.com">inkwizytoryankes@gmail.com</a>&gt; wrote:<b=
r>&gt; On Monday, March 14, 2016 at 9:53:20 PM UTC+1, Daniel Frey wrote:<br=
>&gt;&gt; On 14.03.2016, at 01:03, <a href=3D"mailto:inkwizyt...@gmail.com"=
>inkwizyt...@gmail.com</a> wrote:<br>&gt;&gt; &gt;<br>&gt;&gt; &gt; templat=
e&lt;typename Tuple&gt;<br>&gt;&gt; &gt; using Expand =3D typename... Tuple=
::pack; //of if tuple don&#39;t have we can<br>&gt;&gt; &gt; crate helper t=
emplate that will extract parameter pack from tuple<br>&gt;&gt;<br>&gt;&gt;=
 Note that this is not part of what I&#39;m proposing. The using syntax in =
my<br>&gt;&gt; proposal for packs does explicitly not allow to be templated=
, otherwise the<br>&gt;&gt; same problem with nested packs and the expansio=
n will come up again.<br>&gt;<br>&gt; Today I think about this and I come t=
o conclusion that you will not avoid<br>&gt; this problems even when bannin=
g templated packs.<br>&gt; Consider template:<br>&gt; template&lt;typename.=
... T&gt;<br>&gt; struct X<br>&gt; {<br>&gt; =C2=A0 =C2=A0 using... Ts =3D T=
;<br>&gt; };<br>&gt;<br>&gt; template&lt;typename... Z&gt;<br>&gt; auto Y()=
<br>&gt; {<br>&gt; =C2=A0 =C2=A0 return F(X&lt;Z&gt;::Ts{}...); //exactly s=
ame situation like `Tp&lt;Z&gt;` where<br>&gt; `Tp` is templated pack.<br>&=
gt; };<br><br><div>My understanding (from Daniel&#39;s reply to my most rec=
ent post) is that Daniel would ban expressions like the above.</div><div>He=
&#39;d allow &quot;naked packs&quot; to be used <i>only</i> in <font face=
=3D"monospace, monospace">using...</font> declarations.</div><div><br></div=
><div><font face=3D"monospace, monospace">template&lt;typename... T&gt; str=
uct X {</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =
using... Ts =3D T; =C2=A0// OK</font></div><div><font face=3D"monospace, mo=
nospace">};</font></div><div><font face=3D"monospace, monospace">template&l=
t;typename Y, typename... Z&gt; auto Y() {</font></div><div><font face=3D"m=
onospace, monospace">=C2=A0 =C2=A0 using... MyTs1 =3D X&lt;Y&gt;::Ts; =C2=
=A0// OK</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0=
 using... MyTs2 =3D X&lt;Z&gt;::Ts; =C2=A0// Error: contains an unexpanded =
parameter pack</font></div><div><font face=3D"monospace, monospace">=C2=A0 =
=C2=A0 using... MyTs3 =3D X&lt;Z&gt;::Ts...; =C2=A0// Error: can&#39;t appl=
y &quot;...&quot; to a pattern containing a naked parameter pack</font></di=
v><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 F(X&lt;Y&gt;::Ts{}=
....); =C2=A0// Error: can&#39;t do anything with a naked parameter pack exc=
ept make a pack alias for it</font></div><div><font face=3D"monospace, mono=
space">=C2=A0 =C2=A0 F(MyTs1{}...); =C2=A0// OK</font></div><div><font face=
=3D"monospace, monospace">}</font></div><div><br></div><div>I don&#39;t thi=
nk there are any exploitable holes in it, if it&#39;s locked down to that e=
xtent. But I do think that Daniel needs to get some actual Standardese word=
ing for what you can and can&#39;t do with naked packs, before it will be <=
i>obvious</i> whether there are no holes. His current phrase (&quot;the usi=
ng syntax... does not allow to be templated&quot;) is clearly not clear eno=
ugh. :)</div><div><br></div><div>=E2=80=93Arthur</div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CADvuK0LtMAiBZn-2i2BvWFb%3DC6L8j91%2B=
ndFOeDQ6ax%2Bb-hLJ0w%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoote=
r">https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0LtMA=
iBZn-2i2BvWFb%3DC6L8j91%2BndFOeDQ6ax%2Bb-hLJ0w%40mail.gmail.com</a>.<br />

--001a113d5d26a4ca26052e2ff69a--

.


Author: Daniel Frey <d.frey@gmx.de>
Date: Wed, 16 Mar 2016 21:01:48 +0100
Raw View
--Apple-Mail=_4BAB81EF-83F2-4934-8041-9F23BDC8D9DA
Content-Type: text/plain; charset=UTF-8

> On 16.03.2016, at 20:27, inkwizytoryankes@gmail.com wrote:
>
>> On Monday, March 14, 2016 at 9:53:20 PM UTC+1, Daniel Frey wrote:
>> > On 14.03.2016, at 01:03, inkwizyt...@gmail.com wrote:
>> >
>> >>
>> > With templated packs, expanding tuples would be easy:
>> >
>> > template<typename Tuple>
>> > using Expand = typename... Tuple::pack; //of if tuple don't have we can crate helper template that will extract parameter pack from tuple
>>
>> Note that this is not part of what I'm proposing. The using syntax in my proposal for packs does explicitly not allow to be templated, otherwise the same problem with nested packs and the expansion will come up again.
>>
>> -- Daniel
>>
>
> Today I think about this and I come to conclusion that you will not avoid this problems even when banning templated packs.
> Consider template:
> template<typename... T>
> struct X
> {
>     using... Ts = T;
> };
>
> template<typename... Z>
> auto Y()
> {
>     return F(X<Z>::Ts{}...); //exactly same situation like `Tp<Z>` where `Tp` is templated pack.
> };

No, this is not part of my proposal. You don't access ::Ts (a pack) without explicitly using syntax 1.3/2.3 and with that, it is not possible to form a pack of packs.

> I think you will not able to run from "packs of packs". I you allow that pack can be defined in structure than you can have something like that:

I allow packs being defined in structures, but I do not allow the "normal" access. This is what allows me to prevent to control pack creation and avoid having to deal with pack of packs, etc.

> template<typename... T>
> void f()
> {
>     g(T::pack...); //each of `T` have member pack definition `typename... pack = int, long;`
> }

Again, not allowed in this way with my proposal. Yes, the next version of the document will put some emphasis on this :)

-- Daniel

--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CFBB182B-F589-4DCE-8F14-59A2802795A0%40gmx.de.

--Apple-Mail=_4BAB81EF-83F2-4934-8041-9F23BDC8D9DA
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename=signature.asc
Content-Type: application/pgp-signature;
 name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iEYEARECAAYFAlbpu6wACgkQAUxJbew56yHMcgCbBVSAx7Nt+flv2QiWfy+bIe9p
BAAAn0fmVdp1H0ERe0DSb4/A54q8bYtr
=ZmiE
-----END PGP SIGNATURE-----

--Apple-Mail=_4BAB81EF-83F2-4934-8041-9F23BDC8D9DA--

.