Topic: Augment the Preprocessor to Get Rid of Mores


Author: Ricardo Fabiano de Andrade <ricardofabianodeandrade@gmail.com>
Date: Fri, 16 Dec 2016 06:29:03 +0000
Raw View
--001a114c9f8e4eb0730543c0b048
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Arthur,
I knew this would be hard to sell, so I really appreciate your comments.
Let me try to address your questions here.

On Tue, Dec 13, 2016 at 8:36 PM Arthur O'Dwyer <arthur.j.odwyer@gmail.com>
wrote:

On Tuesday, December 13, 2016 at 7:36:06 AM UTC-8, Ricardo Andrade wrote:


*The Macro Listing Operation*

This is an operation which lists the declared macros. [...]

it is proposed to have a function-like internal macro tentatively named:
__DEFINED_MACROS__(filter)

Being "filter" a string literal (more below).
The returned value is the following:
- If the filter matches anything, the result is the comma-separated macro
names.
- If no matches are found, the result is nothing.

[...]

For example, using the following snippet (extracted from OpenLDAP ldap.h):

#define LDAP_DEBUG_TRACE 0x001

#define LDAP_DEBUG_PACKETS 0x002

#define LDAP_DEBUG_ARGS  0x004

The call below:
__DEFINED_MACROS__("LDAP_DEBUG_*")

Would have the result of:

LDAP_DEBUG_TRACE, LDAP_DEBUG_PACKETS, LDAP_DEBUG_ARGS

Which in turn could be input for (non working, just illustrative):

#define FOR_EACH(function, ...) // out of the scope of this proposal
#define DECLARE_ENUM(macro) e#macro =3D macro,
// Redeclare LDAP debug constants as a strong-typed enum.
enum class LdapDebug {
FOR_EACH(DECLARE_ENUM, __DEFINED_MACROS__("LDAP_DEBUG_*"));
}; // aware of the trailing comma, please ignore it

Now, LdapDebug names and values could be used in C++ and also available to
reflection.


It sounds like you're proposing that working programmers should write code
such as

// approach (P)
#include "ldap.h"
#define FOR_EACH(function, ...) // yikes
#define DECLARE_ENUM(x) e##x =3D x,

enum class LdapDebug {
FOR_EACH(DECLARE_ENUM, __DEFINED_MACROS__("LDAP_DEBUG_*"));
};


where the // yikes stands for a lot of preprocessor metaprogramming that
even I don't want to tackle, although I'm aware that libraries such as 8pp
exist for the purpose.

We're on the same page on the "yikes", that's why I didn't put the
implementation of the FOR_EACH in the example up to discussion (for now).
However, I don't see other alternative which:
- It's not manually done and a pain to maintain.
- Does not rely on external tools, or additional compilation steps.
- Can be done by both library owners and library users.
- Can be done systematically (whole libraries) or in piecemeal size (just a
few relevant macros that fit a purpose).

Preprocessor metaprogramming is really creepy but have you considered that
such proposal could even relieve some of that burden?
I don't totally understand the sorcery behind this kind of metaprogramming
but I'd love to hear from people who does how much power they would gain by
having some introspection on the declarared macros, specially if that makes
Preprocessor metaprogramming more digestible for the use cases where it
makes sense -- again, mechanical code generation.


I don't understand why any programmer would want to go to all the above
effort instead of either

// approach (A)
enum class LdapDebug {
    eLDAP_DEBUG_TRACE =3D 1,
    eLDAP_DEBUG_PACKETS =3D 2,
    eLDAP_DEBUG_ARGS =3D 4,
};

// or approach (B)
#include "ldap.h"
enum class LdapDebug {
    eLDAP_DEBUG_TRACE =3D LDAP_DEBUG_TRACE,
    eLDAP_DEBUG_PACKETS =3D LDAP_DEBUG_PACKETS,
    eLDAP_DEBUG_ARGS =3D LDAP_DEBUG_ARGS,
};

or approach (C), which would be to submit a pull request upstream to
"ldap.h".


Approach A) and B) are error-prone because:
- one may miss a macro definition, A) is even worst, you may end up
assigning the wrong value -- then detected during tests or found later on
as a bug? Let's try to avoid that.
- as the dependencies evolve, this code this needs to be revisited -- you
may say the that some other code down below the chain would have to be
adjusted anyway. Probably, but not always and if we think that the such
code would be using with static reflection, there an even bigger chance
that such code would not need to be touched.

For approach C), what could be just a source dependency would be a project
one. The application code now needs the blessing of who knows how many
library owners and maintainers to work as intended and move forward. Also,
have in mind that not all code we deal with is open source.

Please don't get me wrong, I can see such approach being used if the
proposal presented here goes ahead and that may work for many libraries if
attempted but I wouldn't hold my breath for it. I'm still using using C
libraries that don't even have a "#ifdef __cplusplus extern "C"..."



Stretch this ideas of this proposal a little bit and you can vision
definitions being redeclared this way and used in C++ instead of the legacy
macros which in turn could get deprecated over time (of course, if C
support is to be dropped). The author of this proposal can see derivations
of such work aiding with a better support modules in legacy environments
too.


I don't understand how encouraging macro metaprogramming would in any way
lead to the "deprecation" of "legacy macros". If I understand correctly,
you're asking for the legacy macro system to be *strengthened* to the point
where working programmers are using it to do metaprogramming even in C++.
The general party line in C++ today is that working programmers should not
be using preprocessor macros for just about anything, because we have
semantically safer versions of the same toolkit that are not based on
textual substitution: enums, inline functions, pass-by-reference,...

If such functionality can already be achieved using already available
techniques, I'd love to hear more.


I'd point you to approaches A, B, and C above.

=E2=80=93Arthur



Maybe you didn't initially understand because 1) dealing with C libraries
or C++ libraries which rely on macros is not part of your daily work and 2)
you have not yet considered the implications of using such libraries in the
context of static reflection -- which see no macros -- and possibly modules
-- which do not export/import macros.

Let me suggest the generic problem this proposal tries to alleviate:

a) A given library provides a number of macros

b) As a user of such library one wants not to only rely on their values but
also on their names, on how they are grouped and related to each other.

c) Enumerations, constants, functions, and other "high-level" C++
constructs will be used to represent all these information.

d) Once they are all defined, the user of the library will rely on static
reflection and template metaprogramming to infer about the code, for
example mapping (enum) codes to names during compile time.

e - maybe?) Declarations made in the step c) are exported into a module.


This proposal, along with an undetermined amount of Preprocessor
metaprogramming, is an attempt to automate c) as much as possible to make
it easier to elevate macros to the level of actual C++ declarations.


Once this is made possible, such automated declarations require little to
no maintenance and can even be offered back to the library owners, which
would then have a proper C++ API for their code.


If the library is question does not need to interoperate with C, over time
these macros can be deprecated in favor of the interface generated with the
help of Preprocessor introspection. Using the preprocessed output can even
by reasonable to consider.


And if it all goes really (really) well, it may be the door out of C some
may be waiting for. We can dream, can't we?


I hope that clarifies the idea.








--=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
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/8ca43f3a-344d-=
4844-af5e-04898173e11f%40isocpp.org
<https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/8ca43f3a-344d=
-4844-af5e-04898173e11f%40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter=
>
..

--=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/CA%2BfGSbMUsUnrEBfxmgNkBe8-SwXDx3fWws2U-ZQOaYt0F=
1yBpg%40mail.gmail.com.

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

<div><div class=3D"gmail_msg"><div class=3D"gmail_msg">Arthur,</div><div cl=
ass=3D"gmail_msg">I knew this would be hard to sell, so I really appreciate=
 your comments. Let me try to address your questions here.</div><div class=
=3D"gmail_msg"><br class=3D"gmail_msg"><div class=3D"gmail_quote gmail_msg"=
></div></div></div></div><div><div class=3D"gmail_msg"><div class=3D"gmail_=
msg"><div class=3D"gmail_quote gmail_msg"><div class=3D"gmail_msg">On Tue, =
Dec 13, 2016 at 8:36 PM Arthur O&#39;Dwyer &lt;<a href=3D"mailto:arthur.j.o=
dwyer@gmail.com" class=3D"gmail_msg" target=3D"_blank">arthur.j.odwyer@gmai=
l.com</a>&gt; wrote:<br class=3D"gmail_msg"></div></div></div><div class=3D=
"gmail_msg"><div class=3D"gmail_quote gmail_msg"><blockquote class=3D"gmail=
_quote gmail_msg" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;pad=
ding-left:1ex"><div class=3D"gmail_msg">On Tuesday, December 13, 2016 at 7:=
36:06 AM UTC-8, Ricardo Andrade wrote:</div><div class=3D"gmail_msg"><block=
quote class=3D"gmail_quote gmail_msg" style=3D"margin:0;margin-left:0.8ex;b=
order-left:1px #ccc solid;padding-left:1ex"><div class=3D"gmail_msg"><div c=
lass=3D"gmail_msg"><br class=3D"gmail_msg"></div><div class=3D"gmail_msg"><=
b class=3D"gmail_msg">The Macro Listing Operation</b><br class=3D"gmail_msg=
"></div><div class=3D"gmail_msg"><br class=3D"gmail_msg"></div><div class=
=3D"gmail_msg">This is an operation which lists the declared macros. [...]<=
/div></div></blockquote></div><div class=3D"gmail_msg"><blockquote class=3D=
"gmail_quote gmail_msg" style=3D"margin:0;margin-left:0.8ex;border-left:1px=
 #ccc solid;padding-left:1ex"><div class=3D"gmail_msg"><div class=3D"gmail_=
msg">it is proposed to have a function-like internal macro tentatively name=
d: __DEFINED_MACROS__(filter)</div><div class=3D"gmail_msg"><br class=3D"gm=
ail_msg"></div><div class=3D"gmail_msg">Being &quot;filter&quot; a string l=
iteral (more below).<br class=3D"gmail_msg"></div><div class=3D"gmail_msg">=
<div class=3D"gmail_msg">The returned value is the following:</div><div cla=
ss=3D"gmail_msg">- If the filter matches anything, the result is the comma-=
separated macro names.</div><div class=3D"gmail_msg">- If no matches are fo=
und, the result is nothing.</div></div></div></blockquote></div><div class=
=3D"gmail_msg"><blockquote class=3D"gmail_quote gmail_msg" style=3D"margin:=
0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div class=
=3D"gmail_msg"><div class=3D"gmail_msg">[...]</div></div></blockquote></div=
><div class=3D"gmail_msg"><blockquote class=3D"gmail_quote gmail_msg" style=
=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"=
><div class=3D"gmail_msg"><div class=3D"gmail_msg">For example, using the f=
ollowing snippet (extracted from OpenLDAP ldap.h):</div><div class=3D"gmail=
_msg"><pre style=3D"color:rgb(0,0,0);word-wrap:break-word;white-space:pre-w=
rap" class=3D"gmail_msg">#define LDAP_DEBUG_TRACE 0x001<br class=3D"gmail_m=
sg"><br class=3D"gmail_msg">#define LDAP_DEBUG_PACKETS 0x002<br class=3D"gm=
ail_msg"><br class=3D"gmail_msg">#define LDAP_DEBUG_ARGS  0x004</pre></div>=
<div class=3D"gmail_msg">The call below:</div><div class=3D"gmail_msg">__DE=
FINED_MACROS__(&quot;LDAP_DEBUG_*&quot;)</div><div class=3D"gmail_msg"><br =
class=3D"gmail_msg"></div></div></blockquote></div><div class=3D"gmail_msg"=
><blockquote class=3D"gmail_quote gmail_msg" style=3D"margin:0;margin-left:=
0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div class=3D"gmail_msg"=
><div class=3D"gmail_msg">Would have the result of:</div><div class=3D"gmai=
l_msg"><pre style=3D"color:rgb(0,0,0);word-wrap:break-word;white-space:pre-=
wrap" class=3D"gmail_msg">LDAP_DEBUG_TRACE, LDAP_DEBUG_PACKETS, LDAP_DEBUG_=
ARGS</pre></div></div></blockquote></div><div class=3D"gmail_msg"><blockquo=
te class=3D"gmail_quote gmail_msg" style=3D"margin:0;margin-left:0.8ex;bord=
er-left:1px #ccc solid;padding-left:1ex"><div class=3D"gmail_msg"><div clas=
s=3D"gmail_msg">Which in turn could be input for (non working, just illustr=
ative):</div><div class=3D"gmail_msg"><br class=3D"gmail_msg"></div><div cl=
ass=3D"gmail_msg"><font face=3D"monospace, monospace" class=3D"gmail_msg">#=
define FOR_EACH(function, ...) // out of the scope of this proposal</font><=
/div><div class=3D"gmail_msg"><font face=3D"monospace, monospace" class=3D"=
gmail_msg">#define DECLARE_ENUM(macro) e#macro =3D macro,</font></div><div =
class=3D"gmail_msg"><font face=3D"monospace, monospace" class=3D"gmail_msg"=
>// Redeclare LDAP debug constants as a strong-typed enum.</font></div><div=
 class=3D"gmail_msg"><font face=3D"monospace, monospace" class=3D"gmail_msg=
">enum class LdapDebug {</font></div><div class=3D"gmail_msg"><font face=3D=
"monospace, monospace" class=3D"gmail_msg">FOR_EACH(DECLARE_ENUM,=C2=A0__DE=
FINED_MACROS__(&quot;LDAP_DEBUG_*&quot;));</font></div><div class=3D"gmail_=
msg"><font face=3D"monospace, monospace" class=3D"gmail_msg">}; // aware of=
 the trailing comma, please ignore it</font></div><div class=3D"gmail_msg">=
<br class=3D"gmail_msg"></div><div class=3D"gmail_msg">Now, <font face=3D"m=
onospace, monospace" class=3D"gmail_msg">LdapDebug </font>names and values =
could be used in C++ and also available to reflection.</div></div></blockqu=
ote></div><div class=3D"gmail_msg"><blockquote class=3D"gmail_quote gmail_m=
sg" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-=
left:1ex"><div class=3D"gmail_msg"></div></blockquote><div class=3D"gmail_m=
sg"><br class=3D"gmail_msg"></div><div class=3D"gmail_msg">It sounds like y=
ou&#39;re proposing that working programmers should write code such as</div=
><div class=3D"gmail_msg"><br class=3D"gmail_msg"></div><div class=3D"m_-74=
07037260092287201m_2732394788529763161m_3034768921295443557prettyprint gmai=
l_msg" style=3D"background-color:rgb(250,250,250);border:1px solid rgb(187,=
187,187);word-wrap:break-word"><code class=3D"m_-7407037260092287201m_27323=
94788529763161m_3034768921295443557prettyprint gmail_msg"><div class=3D"m_-=
7407037260092287201m_2732394788529763161m_3034768921295443557subprettyprint=
 gmail_msg"><span style=3D"color:#800" class=3D"m_-7407037260092287201m_273=
2394788529763161m_3034768921295443557styled-by-prettify gmail_msg">// appro=
ach (P)</span><span style=3D"color:#000" class=3D"m_-7407037260092287201m_2=
732394788529763161m_3034768921295443557styled-by-prettify gmail_msg"><br cl=
ass=3D"gmail_msg"></span><span style=3D"color:#800" class=3D"m_-74070372600=
92287201m_2732394788529763161m_3034768921295443557styled-by-prettify gmail_=
msg">#include</span><span style=3D"color:#000" class=3D"m_-7407037260092287=
201m_2732394788529763161m_3034768921295443557styled-by-prettify gmail_msg">=
 </span><span style=3D"color:#080" class=3D"m_-7407037260092287201m_2732394=
788529763161m_3034768921295443557styled-by-prettify gmail_msg">&quot;ldap.h=
&quot;</span><span style=3D"color:#000" class=3D"m_-7407037260092287201m_27=
32394788529763161m_3034768921295443557styled-by-prettify gmail_msg"><br cla=
ss=3D"gmail_msg"></span><span style=3D"color:#800" class=3D"m_-740703726009=
2287201m_2732394788529763161m_3034768921295443557styled-by-prettify gmail_m=
sg">#define</span><span style=3D"color:#000" class=3D"m_-740703726009228720=
1m_2732394788529763161m_3034768921295443557styled-by-prettify gmail_msg"> F=
OR_EACH</span><span style=3D"color:#660" class=3D"m_-7407037260092287201m_2=
732394788529763161m_3034768921295443557styled-by-prettify gmail_msg">(</spa=
n><span style=3D"color:#008" class=3D"m_-7407037260092287201m_2732394788529=
763161m_3034768921295443557styled-by-prettify gmail_msg">function</span><sp=
an style=3D"color:#660" class=3D"m_-7407037260092287201m_273239478852976316=
1m_3034768921295443557styled-by-prettify gmail_msg">,</span><span style=3D"=
color:#000" class=3D"m_-7407037260092287201m_2732394788529763161m_303476892=
1295443557styled-by-prettify gmail_msg"> </span><span style=3D"color:#660" =
class=3D"m_-7407037260092287201m_2732394788529763161m_3034768921295443557st=
yled-by-prettify gmail_msg">...)</span><span style=3D"color:#000" class=3D"=
m_-7407037260092287201m_2732394788529763161m_3034768921295443557styled-by-p=
rettify gmail_msg"> </span><span style=3D"color:#800" class=3D"m_-740703726=
0092287201m_2732394788529763161m_3034768921295443557styled-by-prettify gmai=
l_msg">// yikes</span><span style=3D"color:#000" class=3D"m_-74070372600922=
87201m_2732394788529763161m_3034768921295443557styled-by-prettify gmail_msg=
"><br class=3D"gmail_msg"></span><span style=3D"color:#800" class=3D"m_-740=
7037260092287201m_2732394788529763161m_3034768921295443557styled-by-prettif=
y gmail_msg">#define</span><span style=3D"color:#000" class=3D"m_-740703726=
0092287201m_2732394788529763161m_3034768921295443557styled-by-prettify gmai=
l_msg"> DECLARE_ENUM</span><span style=3D"color:#660" class=3D"m_-740703726=
0092287201m_2732394788529763161m_3034768921295443557styled-by-prettify gmai=
l_msg">(</span><span style=3D"color:#000" class=3D"m_-7407037260092287201m_=
2732394788529763161m_3034768921295443557styled-by-prettify gmail_msg">x</sp=
an><span style=3D"color:#660" class=3D"m_-7407037260092287201m_273239478852=
9763161m_3034768921295443557styled-by-prettify gmail_msg">)</span><span sty=
le=3D"color:#000" class=3D"m_-7407037260092287201m_2732394788529763161m_303=
4768921295443557styled-by-prettify gmail_msg"> e</span><span style=3D"color=
:#800" class=3D"m_-7407037260092287201m_2732394788529763161m_30347689212954=
43557styled-by-prettify gmail_msg">##x =3D x,</span></div></code></div></di=
v><div class=3D"gmail_msg"><div class=3D"m_-7407037260092287201m_2732394788=
529763161m_3034768921295443557prettyprint gmail_msg" style=3D"background-co=
lor:rgb(250,250,250);border:1px solid rgb(187,187,187);word-wrap:break-word=
"><code class=3D"m_-7407037260092287201m_2732394788529763161m_3034768921295=
443557prettyprint gmail_msg"><div class=3D"m_-7407037260092287201m_27323947=
88529763161m_3034768921295443557subprettyprint gmail_msg"><span style=3D"co=
lor:#000" class=3D"m_-7407037260092287201m_2732394788529763161m_30347689212=
95443557styled-by-prettify gmail_msg"><br class=3D"gmail_msg"></span><span =
style=3D"color:#008" class=3D"m_-7407037260092287201m_2732394788529763161m_=
3034768921295443557styled-by-prettify gmail_msg">enum</span><span style=3D"=
color:#000" class=3D"m_-7407037260092287201m_2732394788529763161m_303476892=
1295443557styled-by-prettify gmail_msg"> </span><span style=3D"color:#008" =
class=3D"m_-7407037260092287201m_2732394788529763161m_3034768921295443557st=
yled-by-prettify gmail_msg">class</span><span style=3D"color:#000" class=3D=
"m_-7407037260092287201m_2732394788529763161m_3034768921295443557styled-by-=
prettify gmail_msg"> </span><span style=3D"color:#606" class=3D"m_-74070372=
60092287201m_2732394788529763161m_3034768921295443557styled-by-prettify gma=
il_msg">LdapDebug</span><span style=3D"color:#000" class=3D"m_-740703726009=
2287201m_2732394788529763161m_3034768921295443557styled-by-prettify gmail_m=
sg"> </span><span style=3D"color:#660" class=3D"m_-7407037260092287201m_273=
2394788529763161m_3034768921295443557styled-by-prettify gmail_msg">{</span>=
<span style=3D"color:#000" class=3D"m_-7407037260092287201m_273239478852976=
3161m_3034768921295443557styled-by-prettify gmail_msg"><br class=3D"gmail_m=
sg">FOR_EACH</span><span style=3D"color:#660" class=3D"m_-74070372600922872=
01m_2732394788529763161m_3034768921295443557styled-by-prettify gmail_msg">(=
</span><span style=3D"color:#000" class=3D"m_-7407037260092287201m_27323947=
88529763161m_3034768921295443557styled-by-prettify gmail_msg">DECLARE_ENUM<=
/span><span style=3D"color:#660" class=3D"m_-7407037260092287201m_273239478=
8529763161m_3034768921295443557styled-by-prettify gmail_msg">,</span><span =
style=3D"color:#000" class=3D"m_-7407037260092287201m_2732394788529763161m_=
3034768921295443557styled-by-prettify gmail_msg"> __DEFINED_MACROS__</span>=
<span style=3D"color:#660" class=3D"m_-7407037260092287201m_273239478852976=
3161m_3034768921295443557styled-by-prettify gmail_msg">(</span><span style=
=3D"color:#080" class=3D"m_-7407037260092287201m_2732394788529763161m_30347=
68921295443557styled-by-prettify gmail_msg">&quot;LDAP_DEBUG_*&quot;</span>=
<span style=3D"color:#660" class=3D"m_-7407037260092287201m_273239478852976=
3161m_3034768921295443557styled-by-prettify gmail_msg">));</span><span styl=
e=3D"color:#000" class=3D"m_-7407037260092287201m_2732394788529763161m_3034=
768921295443557styled-by-prettify gmail_msg"><br class=3D"gmail_msg"></span=
><span style=3D"color:#660" class=3D"m_-7407037260092287201m_27323947885297=
63161m_3034768921295443557styled-by-prettify gmail_msg">};</span></div></co=
de></div></div></blockquote></div></div><div class=3D"gmail_msg"><div class=
=3D"gmail_quote gmail_msg"><blockquote class=3D"gmail_quote gmail_msg" styl=
e=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div cl=
ass=3D"gmail_msg"><div class=3D"m_-7407037260092287201m_2732394788529763161=
m_3034768921295443557prettyprint gmail_msg" style=3D"background-color:rgb(2=
50,250,250);border:1px solid rgb(187,187,187);word-wrap:break-word"><code c=
lass=3D"m_-7407037260092287201m_2732394788529763161m_3034768921295443557pre=
ttyprint gmail_msg"><div class=3D"m_-7407037260092287201m_27323947885297631=
61m_3034768921295443557subprettyprint gmail_msg"></div></code></div><div cl=
ass=3D"gmail_msg"><div class=3D"gmail_msg"><font face=3D"monospace, monospa=
ce" class=3D"gmail_msg"><br class=3D"gmail_msg"></font></div></div><div cla=
ss=3D"gmail_msg">where the <font face=3D"courier new, monospace" class=3D"g=
mail_msg">// yikes</font>=C2=A0stands for a lot of preprocessor metaprogram=
ming that even I don&#39;t want to tackle, although I&#39;m aware that libr=
aries such as 8pp exist for the purpose.</div><div class=3D"gmail_msg"><br =
class=3D"gmail_msg"></div></div></blockquote></div></div></div></div><div><=
div class=3D"gmail_msg"><div class=3D"gmail_msg"><div class=3D"gmail_quote =
gmail_msg"><blockquote class=3D"gmail_quote gmail_msg" style=3D"margin:0 0 =
0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class=3D"gmail_msg=
"><div class=3D"gmail_msg">We&#39;re on the same page on the &quot;yikes&qu=
ot;, that&#39;s why I didn&#39;t put the implementation of the FOR_EACH in =
the example up to discussion (for now). However, I don&#39;t see other alte=
rnative which:<br class=3D"gmail_msg"></div><div class=3D"gmail_msg">- It&#=
39;s not manually done and a pain to maintain.</div><div class=3D"gmail_msg=
">- Does not rely on external tools, or additional compilation steps.</div>=
<div class=3D"gmail_msg">- Can be done by both library owners and library u=
sers.</div><div class=3D"gmail_msg">- Can be done systematically (whole lib=
raries) or in piecemeal size (just a few relevant macros that fit a purpose=
).</div><div class=3D"gmail_msg"><br class=3D"gmail_msg"></div><div class=
=3D"gmail_msg">Preprocessor metaprogramming is really creepy but have you c=
onsidered that such proposal could even relieve some of that burden?</div><=
div class=3D"gmail_msg">I don&#39;t totally understand the sorcery behind t=
his kind of metaprogramming but I&#39;d love to hear from people who does h=
ow much power they would gain by having some introspection on the declarare=
d macros, specially if that makes Preprocessor metaprogramming more digesti=
ble for the use cases where it makes sense -- again, mechanical code genera=
tion.</div></div></blockquote></div></div></div></div><div><div class=3D"gm=
ail_msg"><div class=3D"gmail_msg"><div class=3D"gmail_quote gmail_msg"><blo=
ckquote class=3D"gmail_quote gmail_msg" style=3D"margin:0 0 0 .8ex;border-l=
eft:1px #ccc solid;padding-left:1ex"><div class=3D"gmail_msg"><div class=3D=
"gmail_msg"><br class=3D"gmail_msg"></div><div class=3D"gmail_msg">I don&#3=
9;t understand why any programmer would want to go to all the above effort =
instead of either<br class=3D"gmail_msg"></div><div class=3D"gmail_msg"><br=
 class=3D"gmail_msg"></div><div class=3D"m_-7407037260092287201m_2732394788=
529763161m_3034768921295443557prettyprint gmail_msg" style=3D"background-co=
lor:rgb(250,250,250);border:1px solid rgb(187,187,187);word-wrap:break-word=
"><code class=3D"m_-7407037260092287201m_2732394788529763161m_3034768921295=
443557prettyprint gmail_msg"><div class=3D"m_-7407037260092287201m_27323947=
88529763161m_3034768921295443557subprettyprint gmail_msg"><span style=3D"co=
lor:#800" class=3D"m_-7407037260092287201m_2732394788529763161m_30347689212=
95443557styled-by-prettify gmail_msg">// approach (A)</span><span style=3D"=
color:#000" class=3D"m_-7407037260092287201m_2732394788529763161m_303476892=
1295443557styled-by-prettify gmail_msg"><br class=3D"gmail_msg"></span><spa=
n style=3D"color:#008" class=3D"m_-7407037260092287201m_2732394788529763161=
m_3034768921295443557styled-by-prettify gmail_msg">enum</span><span style=
=3D"color:#000" class=3D"m_-7407037260092287201m_2732394788529763161m_30347=
68921295443557styled-by-prettify gmail_msg"> </span><span style=3D"color:#0=
08" class=3D"m_-7407037260092287201m_2732394788529763161m_30347689212954435=
57styled-by-prettify gmail_msg">class</span><span style=3D"color:#000" clas=
s=3D"m_-7407037260092287201m_2732394788529763161m_3034768921295443557styled=
-by-prettify gmail_msg"> </span><span style=3D"color:#606" class=3D"m_-7407=
037260092287201m_2732394788529763161m_3034768921295443557styled-by-prettify=
 gmail_msg">LdapDebug</span><span style=3D"color:#000" class=3D"m_-74070372=
60092287201m_2732394788529763161m_3034768921295443557styled-by-prettify gma=
il_msg"> </span><span style=3D"color:#660" class=3D"m_-7407037260092287201m=
_2732394788529763161m_3034768921295443557styled-by-prettify gmail_msg">{</s=
pan><span style=3D"color:#000" class=3D"m_-7407037260092287201m_27323947885=
29763161m_3034768921295443557styled-by-prettify gmail_msg"><br class=3D"gma=
il_msg">=C2=A0 =C2=A0 eLDAP_DEBUG_TRACE </span><span style=3D"color:#660" c=
lass=3D"m_-7407037260092287201m_2732394788529763161m_3034768921295443557sty=
led-by-prettify gmail_msg">=3D</span><span style=3D"color:#000" class=3D"m_=
-7407037260092287201m_2732394788529763161m_3034768921295443557styled-by-pre=
ttify gmail_msg"> </span><span style=3D"color:#066" class=3D"m_-74070372600=
92287201m_2732394788529763161m_3034768921295443557styled-by-prettify gmail_=
msg">1</span><span style=3D"color:#660" class=3D"m_-7407037260092287201m_27=
32394788529763161m_3034768921295443557styled-by-prettify gmail_msg">,</span=
><span style=3D"color:#000" class=3D"m_-7407037260092287201m_27323947885297=
63161m_3034768921295443557styled-by-prettify gmail_msg"><br class=3D"gmail_=
msg">=C2=A0 =C2=A0 eLDAP_DEBUG_PACKETS </span><span style=3D"color:#660" cl=
ass=3D"m_-7407037260092287201m_2732394788529763161m_3034768921295443557styl=
ed-by-prettify gmail_msg">=3D</span><span style=3D"color:#000" class=3D"m_-=
7407037260092287201m_2732394788529763161m_3034768921295443557styled-by-pret=
tify gmail_msg"> </span><span style=3D"color:#066" class=3D"m_-740703726009=
2287201m_2732394788529763161m_3034768921295443557styled-by-prettify gmail_m=
sg">2</span><span style=3D"color:#660" class=3D"m_-7407037260092287201m_273=
2394788529763161m_3034768921295443557styled-by-prettify gmail_msg">,</span>=
<span style=3D"color:#000" class=3D"m_-7407037260092287201m_273239478852976=
3161m_3034768921295443557styled-by-prettify gmail_msg"><br class=3D"gmail_m=
sg">=C2=A0 =C2=A0 eLDAP_DEBUG_ARGS </span><span style=3D"color:#660" class=
=3D"m_-7407037260092287201m_2732394788529763161m_3034768921295443557styled-=
by-prettify gmail_msg">=3D</span><span style=3D"color:#000" class=3D"m_-740=
7037260092287201m_2732394788529763161m_3034768921295443557styled-by-prettif=
y gmail_msg"> </span><span style=3D"color:#066" class=3D"m_-740703726009228=
7201m_2732394788529763161m_3034768921295443557styled-by-prettify gmail_msg"=
>4</span><span style=3D"color:#660" class=3D"m_-7407037260092287201m_273239=
4788529763161m_3034768921295443557styled-by-prettify gmail_msg">,</span><sp=
an style=3D"color:#000" class=3D"m_-7407037260092287201m_273239478852976316=
1m_3034768921295443557styled-by-prettify gmail_msg"><br class=3D"gmail_msg"=
></span><span style=3D"color:#660" class=3D"m_-7407037260092287201m_2732394=
788529763161m_3034768921295443557styled-by-prettify gmail_msg">};</span><sp=
an style=3D"color:#000" class=3D"m_-7407037260092287201m_273239478852976316=
1m_3034768921295443557styled-by-prettify gmail_msg"><br class=3D"gmail_msg"=
><br class=3D"gmail_msg"></span><span style=3D"color:#800" class=3D"m_-7407=
037260092287201m_2732394788529763161m_3034768921295443557styled-by-prettify=
 gmail_msg">// or approach (B)</span><span style=3D"color:#000" class=3D"m_=
-7407037260092287201m_2732394788529763161m_3034768921295443557styled-by-pre=
ttify gmail_msg"><br class=3D"gmail_msg"></span><span style=3D"color:#800" =
class=3D"m_-7407037260092287201m_2732394788529763161m_3034768921295443557st=
yled-by-prettify gmail_msg">#include</span><span style=3D"color:#000" class=
=3D"m_-7407037260092287201m_2732394788529763161m_3034768921295443557styled-=
by-prettify gmail_msg"> </span><span style=3D"color:#080" class=3D"m_-74070=
37260092287201m_2732394788529763161m_3034768921295443557styled-by-prettify =
gmail_msg">&quot;ldap.h&quot;</span><span style=3D"color:#000" class=3D"m_-=
7407037260092287201m_2732394788529763161m_3034768921295443557styled-by-pret=
tify gmail_msg"><br class=3D"gmail_msg"></span><span style=3D"color:#008" c=
lass=3D"m_-7407037260092287201m_2732394788529763161m_3034768921295443557sty=
led-by-prettify gmail_msg">enum</span><span style=3D"color:#000" class=3D"m=
_-7407037260092287201m_2732394788529763161m_3034768921295443557styled-by-pr=
ettify gmail_msg"> </span><span style=3D"color:#008" class=3D"m_-7407037260=
092287201m_2732394788529763161m_3034768921295443557styled-by-prettify gmail=
_msg">class</span><span style=3D"color:#000" class=3D"m_-740703726009228720=
1m_2732394788529763161m_3034768921295443557styled-by-prettify gmail_msg"> <=
/span><span style=3D"color:#606" class=3D"m_-7407037260092287201m_273239478=
8529763161m_3034768921295443557styled-by-prettify gmail_msg">LdapDebug</spa=
n><span style=3D"color:#000" class=3D"m_-7407037260092287201m_2732394788529=
763161m_3034768921295443557styled-by-prettify gmail_msg"> </span><span styl=
e=3D"color:#660" class=3D"m_-7407037260092287201m_2732394788529763161m_3034=
768921295443557styled-by-prettify gmail_msg">{</span><span style=3D"color:#=
000" class=3D"m_-7407037260092287201m_2732394788529763161m_3034768921295443=
557styled-by-prettify gmail_msg"><br class=3D"gmail_msg">=C2=A0 =C2=A0 eLDA=
P_DEBUG_TRACE </span><span style=3D"color:#660" class=3D"m_-740703726009228=
7201m_2732394788529763161m_3034768921295443557styled-by-prettify gmail_msg"=
>=3D</span><span style=3D"color:#000" class=3D"m_-7407037260092287201m_2732=
394788529763161m_3034768921295443557styled-by-prettify gmail_msg"> LDAP_DEB=
UG_TRACE</span><span style=3D"color:#660" class=3D"m_-7407037260092287201m_=
2732394788529763161m_3034768921295443557styled-by-prettify gmail_msg">,</sp=
an><span style=3D"color:#000" class=3D"m_-7407037260092287201m_273239478852=
9763161m_3034768921295443557styled-by-prettify gmail_msg"><br class=3D"gmai=
l_msg">=C2=A0 =C2=A0 eLDAP_DEBUG_PACKETS </span><span style=3D"color:#660" =
class=3D"m_-7407037260092287201m_2732394788529763161m_3034768921295443557st=
yled-by-prettify gmail_msg">=3D</span><span style=3D"color:#000" class=3D"m=
_-7407037260092287201m_2732394788529763161m_3034768921295443557styled-by-pr=
ettify gmail_msg"> LDAP_DEBUG_PACKETS</span><span style=3D"color:#660" clas=
s=3D"m_-7407037260092287201m_2732394788529763161m_3034768921295443557styled=
-by-prettify gmail_msg">,</span><span style=3D"color:#000" class=3D"m_-7407=
037260092287201m_2732394788529763161m_3034768921295443557styled-by-prettify=
 gmail_msg"><br class=3D"gmail_msg">=C2=A0 =C2=A0 eLDAP_DEBUG_ARGS </span><=
span style=3D"color:#660" class=3D"m_-7407037260092287201m_2732394788529763=
161m_3034768921295443557styled-by-prettify gmail_msg">=3D</span><span style=
=3D"color:#000" class=3D"m_-7407037260092287201m_2732394788529763161m_30347=
68921295443557styled-by-prettify gmail_msg"> LDAP_DEBUG_ARGS</span><span st=
yle=3D"color:#660" class=3D"m_-7407037260092287201m_2732394788529763161m_30=
34768921295443557styled-by-prettify gmail_msg">,</span><span style=3D"color=
:#000" class=3D"m_-7407037260092287201m_2732394788529763161m_30347689212954=
43557styled-by-prettify gmail_msg"><br class=3D"gmail_msg"></span><span sty=
le=3D"color:#660" class=3D"m_-7407037260092287201m_2732394788529763161m_303=
4768921295443557styled-by-prettify gmail_msg">};</span></div></code></div><=
div class=3D"gmail_msg"><br class=3D"gmail_msg"></div><div class=3D"gmail_m=
sg">or approach (C), which would be to submit a pull request upstream to &q=
uot;ldap.h&quot;.</div></div></blockquote></div></div></div></div><div><div=
 class=3D"gmail_msg"><div class=3D"gmail_msg"><div class=3D"gmail_quote gma=
il_msg"><blockquote class=3D"gmail_quote gmail_msg" style=3D"margin:0 0 0 .=
8ex;border-left:1px #ccc solid;padding-left:1ex"><div class=3D"gmail_msg"><=
/div><div class=3D"gmail_msg"><div class=3D"gmail_msg"><br class=3D"gmail_m=
sg"></div><div class=3D"gmail_msg">Approach A) and B) are error-prone becau=
se:</div><div class=3D"gmail_msg">- one may miss a macro definition, A) is =
even worst, you may end up assigning the wrong value -- then detected durin=
g tests or found later on as a bug? Let&#39;s try to avoid that.</div><div =
class=3D"gmail_msg">- as the dependencies evolve, this code this needs to b=
e revisited -- you may say the that some other code down below the chain wo=
uld have to be adjusted anyway. Probably, but not always and if we think th=
at the such code would be using with static reflection, there an even bigge=
r chance that such code would not need to be touched.</div><div class=3D"gm=
ail_msg"><br class=3D"gmail_msg"></div><div class=3D"gmail_msg">For approac=
h C), what could be just a source dependency would be a project one. The ap=
plication code now needs the blessing of who knows how many library owners =
and maintainers to work as intended and move forward. Also, have in mind th=
at not all code we deal with is open source.</div><div class=3D"gmail_msg">=
<br class=3D"gmail_msg"></div><div class=3D"gmail_msg">Please don&#39;t get=
 me wrong, I can see such approach being used if the proposal presented her=
e goes ahead and that may work for many libraries if attempted but I wouldn=
&#39;t hold my breath for it. I&#39;m still using using C libraries that do=
n&#39;t even have a &quot;#ifdef __cplusplus extern &quot;C&quot;...&quot;<=
/div></div></blockquote></div></div></div><div class=3D"gmail_msg"></div></=
div><div><div class=3D"gmail_msg"><div class=3D"gmail_msg"><div class=3D"gm=
ail_quote gmail_msg"><blockquote class=3D"gmail_quote gmail_msg" style=3D"m=
argin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class=3D=
"gmail_msg"><div class=3D"gmail_msg"><br class=3D"gmail_msg"></div><div cla=
ss=3D"gmail_msg"><br class=3D"gmail_msg"></div><blockquote class=3D"gmail_q=
uote gmail_msg" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc so=
lid;padding-left:1ex"><div class=3D"gmail_msg"><div class=3D"gmail_msg">Str=
etch this ideas of this proposal a little bit and you can vision definition=
s being redeclared this way and used in C++ instead of the legacy macros wh=
ich in turn could get deprecated over time (of course, if C support is to b=
e dropped). The author of this proposal can see derivations of such work ai=
ding with a better support modules in legacy environments too.</div></div><=
/blockquote><div class=3D"gmail_msg"><br class=3D"gmail_msg"></div></div></=
blockquote></div></div></div><div class=3D"gmail_msg"><div class=3D"gmail_m=
sg"><div class=3D"gmail_quote gmail_msg"><blockquote class=3D"gmail_quote g=
mail_msg" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-lef=
t:1ex"><div class=3D"gmail_msg"><div class=3D"gmail_msg">I don&#39;t unders=
tand how encouraging macro metaprogramming would in any way lead to the &qu=
ot;deprecation&quot; of &quot;legacy macros&quot;. If I understand correctl=
y, you&#39;re asking for the legacy macro system to be <i class=3D"gmail_ms=
g">strengthened</i> to the point where working programmers are using it to =
do metaprogramming even in C++. The general party line in C++ today is that=
 working programmers should not be using preprocessor macros for just about=
 anything, because we have semantically safer versions of the same toolkit =
that are not based on textual substitution: enums, inline functions, pass-b=
y-reference,...</div></div><div class=3D"gmail_msg"><div class=3D"gmail_msg=
"><br class=3D"gmail_msg"></div><blockquote class=3D"gmail_quote gmail_msg"=
 style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-lef=
t:1ex"><div class=3D"gmail_msg"><div class=3D"gmail_msg">If such functional=
ity can already be achieved using already available techniques, I&#39;d lov=
e to hear more.<br class=3D"gmail_msg"></div></div></blockquote><div class=
=3D"gmail_msg"><br class=3D"gmail_msg"></div></div><div class=3D"gmail_msg"=
><div class=3D"gmail_msg">I&#39;d point you to approaches A, B, and C above=
..</div><div class=3D"gmail_msg"><br class=3D"gmail_msg"></div><div class=3D=
"gmail_msg">=E2=80=93Arthur</div></div><blockquote class=3D"gmail_quote gma=
il_msg" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:=
1ex"><br class=3D"gmail_msg"></blockquote><br class=3D"gmail_msg"></blockqu=
ote></div></div></div></div><div><div class=3D"gmail_msg"><div class=3D"gma=
il_msg"><div class=3D"gmail_quote gmail_msg"><blockquote class=3D"gmail_quo=
te gmail_msg" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding=
-left:1ex">Maybe you didn&#39;t initially understand because 1) dealing wit=
h C libraries or C++ libraries which rely on macros is not part of your dai=
ly work and 2) you have not yet considered the implications of using such l=
ibraries in the context of static reflection -- which see no macros -- and =
possibly modules -- which do not export/import macros.<br class=3D"gmail_ms=
g"><br class=3D"gmail_msg">Let me suggest the generic problem this proposal=
 tries to alleviate:</blockquote><blockquote class=3D"gmail_quote gmail_msg=
" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">a=
) A given library provides a number of macros</blockquote><blockquote class=
=3D"gmail_quote gmail_msg" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc =
solid;padding-left:1ex">b) As a user of such library one wants not to only =
rely on their values but also on their names, on how they are grouped and r=
elated to each other.</blockquote><blockquote class=3D"gmail_quote gmail_ms=
g" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">=
c) Enumerations, constants, functions, and other &quot;high-level&quot; C++=
 constructs will be used to represent all these information.</blockquote><b=
lockquote class=3D"gmail_quote gmail_msg" style=3D"margin:0 0 0 .8ex;border=
-left:1px #ccc solid;padding-left:1ex">d) Once they are all defined, the us=
er of the library will rely on static reflection and template metaprogrammi=
ng to infer about the code, for example mapping (enum) codes to names durin=
g compile time.</blockquote><blockquote class=3D"gmail_quote gmail_msg" sty=
le=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">e - ma=
ybe?) Declarations made in the step c) are exported into a module.</blockqu=
ote><blockquote class=3D"gmail_quote gmail_msg" style=3D"margin:0 0 0 .8ex;=
border-left:1px #ccc solid;padding-left:1ex"><br></blockquote><blockquote c=
lass=3D"gmail_quote gmail_msg" style=3D"margin:0 0 0 .8ex;border-left:1px #=
ccc solid;padding-left:1ex">This proposal, along with an undetermined amoun=
t of Preprocessor metaprogramming, is an attempt to automate c) as much as =
possible to make it easier to elevate macros to the level of actual C++ dec=
larations.</blockquote><blockquote class=3D"gmail_quote gmail_msg" style=3D=
"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br></block=
quote><blockquote class=3D"gmail_quote gmail_msg" style=3D"margin:0 0 0 .8e=
x;border-left:1px #ccc solid;padding-left:1ex">Once this is made possible, =
such automated declarations require little to no maintenance and can even b=
e offered back to the library owners, which would then have a proper C++ AP=
I for their code.</blockquote><blockquote class=3D"gmail_quote gmail_msg" s=
tyle=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>=
</blockquote><blockquote class=3D"gmail_quote gmail_msg" style=3D"margin:0 =
0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">If the library is que=
stion does not need to interoperate with C, over time these macros can be d=
eprecated in favor of the interface generated with the help of Preprocessor=
 introspection. Using the preprocessed output can even by reasonable to con=
sider.</blockquote><blockquote class=3D"gmail_quote gmail_msg" style=3D"mar=
gin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br></blockquot=
e><blockquote class=3D"gmail_quote gmail_msg" style=3D"margin:0 0 0 .8ex;bo=
rder-left:1px #ccc solid;padding-left:1ex">And if it all goes really (reall=
y) well, it may be the door out of C some may be waiting for. We can dream,=
 can&#39;t we?</blockquote><blockquote class=3D"gmail_quote gmail_msg" styl=
e=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br></b=
lockquote><blockquote class=3D"gmail_quote gmail_msg" style=3D"margin:0 0 0=
 .8ex;border-left:1px #ccc solid;padding-left:1ex">I hope that clarifies th=
e idea.</blockquote><blockquote class=3D"gmail_quote gmail_msg" style=3D"ma=
rgin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br></blockquo=
te><blockquote class=3D"gmail_quote gmail_msg" style=3D"margin:0 0 0 .8ex;b=
order-left:1px #ccc solid;padding-left:1ex"><br></blockquote></div></div></=
div></div><div><div class=3D"gmail_msg"><div class=3D"gmail_msg"><div class=
=3D"gmail_quote gmail_msg"><blockquote class=3D"gmail_quote gmail_msg" styl=
e=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br cla=
ss=3D"gmail_msg"><p class=3D"gmail_msg"></p><br class=3D"gmail_msg"><br cla=
ss=3D"gmail_msg"><br class=3D"gmail_msg"><br class=3D"gmail_msg">-- <br cla=
ss=3D"gmail_msg"><br class=3D"gmail_msg"><br class=3D"gmail_msg">You receiv=
ed this message because you are subscribed to the Google Groups &quot;ISO C=
++ Standard - Future Proposals&quot; group.<br class=3D"gmail_msg"><br clas=
s=3D"gmail_msg"><br class=3D"gmail_msg">To unsubscribe from this group and =
stop receiving emails from it, send an email to <a href=3D"mailto:std-propo=
sals+unsubscribe@isocpp.org" class=3D"gmail_msg" target=3D"_blank">std-prop=
osals+unsubscribe@isocpp.org</a>.<br class=3D"gmail_msg"><br class=3D"gmail=
_msg"><br class=3D"gmail_msg">To post to this group, send email to <a href=
=3D"mailto:std-proposals@isocpp.org" class=3D"gmail_msg" target=3D"_blank">=
std-proposals@isocpp.org</a>.<br class=3D"gmail_msg"><br class=3D"gmail_msg=
"><br class=3D"gmail_msg">To view this discussion on the web visit <a href=
=3D"https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/8ca43f3a-3=
44d-4844-af5e-04898173e11f%40isocpp.org?utm_medium=3Demail&amp;utm_source=
=3Dfooter" class=3D"gmail_msg" target=3D"_blank">https://groups.google.com/=
a/isocpp.org/d/msgid/std-proposals/8ca43f3a-344d-4844-af5e-04898173e11f%40i=
socpp.org</a>.<br class=3D"gmail_msg"><br class=3D"gmail_msg"><br class=3D"=
gmail_msg"></blockquote></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/CA%2BfGSbMUsUnrEBfxmgNkBe8-SwXDx3fWws=
2U-ZQOaYt0F1yBpg%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CA%2BfGSbMUsUnr=
EBfxmgNkBe8-SwXDx3fWws2U-ZQOaYt0F1yBpg%40mail.gmail.com</a>.<br />

--001a114c9f8e4eb0730543c0b048--

.