220 23243 <5681D877.3010101@wanadoo.fr> article
Path: news.gmane.org!not-for-mail
From: "Vicente J. Botet Escriba" <vicente.botet@wanadoo.fr>
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: n4428 and Tuple-like access interface reflection
Date: Tue, 29 Dec 2015 01:48:55 +0100
Lines: 277
Approved: news@gmane.org
Message-ID: <5681D877.3010101@wanadoo.fr>
References: <56770133.7070701@wanadoo.fr>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: plane.gmane.org
Mime-Version: 1.0
Content-Type: multipart/alternative;
 boundary="------------070409020409080900010803"
X-Trace: ger.gmane.org 1451350154 15162 80.91.229.3 (29 Dec 2015 00:49:14 GMT)
X-Complaints-To: usenet@ger.gmane.org
NNTP-Posting-Date: Tue, 29 Dec 2015 00:49:14 +0000 (UTC)
To: reflection@isocpp.org, "std-proposals@isocpp.org"
 <std-proposals@isocpp.org>
Original-X-From: std-proposals+bncBDH67CONY4PBB6NQQ62AKGQEMU7DHIY@isocpp.org Tue Dec 29 01:48:59 2015
Return-path: <std-proposals+bncBDH67CONY4PBB6NQQ62AKGQEMU7DHIY@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-wm0-f70.google.com ([74.125.82.70])
	by plane.gmane.org with esmtp (Exim 4.69)
	(envelope-from <std-proposals+bncBDH67CONY4PBB6NQQ62AKGQEMU7DHIY@isocpp.org>)
	id 1aDiTC-00015X-Hn
	for gclcip-std-proposals@m.gmane.org; Tue, 29 Dec 2015 01:48:58 +0100
Original-Received: by mail-wm0-f70.google.com with SMTP id r131sf57730061wma.1
        for <gclcip-std-proposals@m.gmane.org>; Mon, 28 Dec 2015 16:48:58 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=isocpp-org.20150623.gappssmtp.com; s=20150623;
        h=subject:to:references:from:message-id:date:user-agent:mime-version
         :in-reply-to:content-type:x-original-sender
         :x-original-authentication-results:reply-to:precedence:mailing-list
         :list-id:x-spam-checked-in-group:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe;
        bh=y/4IyBXLyRnzbThH/hut3N1igidj53eJ2NNYvgjfb1Q=;
        b=OI4FJW6qWoH2DCC30EqsTiIeVp/DVsf2fQ/oFxplI1e2bk60cHmsSDq6H073A6XrN5
         vl03WbmUWIGNfhyvh6to5spOFn5hUEJbyIFo3jlxkyScgBLxxPQtgNjwhWpNZGP8OVWL
         R9u+dVQPD9WZWQhe3QnF4WyUD1657ooNP1ilpkqHQCGEb2cNw8W8UEDfXgp8tl7AI224
         v0Oun/wg7sZdCc500n9GdwR9BN4opxQAA6OgQX3Fisp6V6S0ai13K9XmKxubrm3vKq0u
         xG89QQiGfFfC5WFOd3fqLUfSPVcPYe+t7dNadut4f1E7yN7CWVq0+uO2/IzIRJPD9G+G
         ZrOQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20130820;
        h=x-gm-message-state:subject:to:references:from:message-id:date
         :user-agent:mime-version:in-reply-to:content-type:x-original-sender
         :x-original-authentication-results:reply-to:precedence:mailing-list
         :list-id:x-spam-checked-in-group:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe;
        bh=y/4IyBXLyRnzbThH/hut3N1igidj53eJ2NNYvgjfb1Q=;
        b=VP33hggQenxAdwVBJaZd8/ZiexFi8SozMs1XkvCpm0eT/1CCAFslC4CxHALPr9TPqO
         HYbRER++juYTjGh6Gck0HC55JYz3MOJ01U4Yj5RsyxqCpOm+tI0kdvJ3ZFAljmek7AdL
         SvLj78M53zu6qkYxoQf63y27IxVZiRWaKTXvRtv7uKBemtrxnyy4OF2sewvYrRLl17xK
         rgf1IeorVhpGJwHMp29Nl4Ugkx4yuRd394wrecdbUwx3BJjSpHd45ru8n429pEGTKxJ9
         E7uvMEA6+DsXTSjAkQzSl2QpvOKsb1vS1Y3bwzmWxMQfADhGOHAUnKMZgabRBi7SSqO2
         4HwQ= 
X-Gm-Message-State: ALoCoQnNLSKQULEaihNRgbtfwtBAnqCs/dQGYwWXIRrWdzjqHkC7cYSkHRtIYleDc9UaT4TuXt1cdCNC/pmaNE7tnJuIPmNnHg==
X-Received: by 10.28.85.2 with SMTP id j2mr6274697wmb.4.1451350137843;
        Mon, 28 Dec 2015 16:48:57 -0800 (PST)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 10.28.89.69 with SMTP id n66ls296379wmb.39.gmail; Mon, 28 Dec
 2015 16:48:56 -0800 (PST)
X-Received: by 10.194.204.232 with SMTP id lb8mr73522715wjc.112.1451350136713;
        Mon, 28 Dec 2015 16:48:56 -0800 (PST)
Original-Received: from smtp.smtpout.orange.fr (smtp04.smtpout.orange.fr. [80.12.242.126])
        by mx.google.com with ESMTPS id bk7si49051512wjb.34.2015.12.28.16.48.56
        for <std-proposals@isocpp.org>
        (version=TLS1 cipher=AES128-SHA bits=128/128);
        Mon, 28 Dec 2015 16:48:56 -0800 (PST)
Received-SPF: neutral (google.com: 80.12.242.126 is neither permitted nor denied by best guess record for domain of vicente.botet@wanadoo.fr) client-ip=80.12.242.126;
Original-Received: from new-host.home ([2.11.57.184])
	by mwinf5d07 with ME
	id zCov1r00H3yV0bE03Cov6p; Tue, 29 Dec 2015 01:48:56 +0100
X-ME-Helo: new-host.home
X-ME-Auth: dmljZW50ZS5ib3RldEB3YW5hZG9vLmZy
X-ME-Date: Tue, 29 Dec 2015 01:48:56 +0100
X-ME-IP: 2.11.57.184
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0)
 Gecko/20100101 Thunderbird/38.4.0
In-Reply-To: <56770133.7070701@wanadoo.fr>
X-Original-Sender: vicente.botet@wanadoo.fr
X-Original-Authentication-Results: mx.google.com;       spf=neutral
 (google.com: 80.12.242.126 is neither permitted nor denied by best guess
 record for domain of vicente.botet@wanadoo.fr) smtp.mailfrom=vicente.botet@wanadoo.fr
Precedence: list
Mailing-list: list std-proposals@isocpp.org; contact std-proposals+owners@isocpp.org
List-ID: <std-proposals.isocpp.org>
X-Spam-Checked-In-Group: std-proposals@isocpp.org
X-Google-Group-Id: 399137483710
List-Post: <https://groups.google.com/a/isocpp.org/group/std-proposals/post>, <mailto:std-proposals@isocpp.org>
List-Help: <https://support.google.com/a/isocpp.org/bin/topic.py?topic=25838>, <mailto:std-proposals+help@isocpp.org>
List-Archive: <https://groups.google.com/a/isocpp.org/group/std-proposals/>
List-Subscribe: <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>,
 <mailto:std-proposals+subscribe@isocpp.org>
List-Unsubscribe: <mailto:googlegroups-manage+399137483710+unsubscribe@googlegroups.com>,
 <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>
Xref: news.gmane.org gmane.comp.lang.c++.isocpp.proposals:23243
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/23243>

This is a multi-part message in MIME format.
--------------070409020409080900010803
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: quoted-printable

Adding std-proposals
Vicente

Le 20/12/2015 20:27, Vicente J. Botet Escriba a =C3=A9crit :
> Hi,
>
> Based on the reflection traitsfrom n4428I would like to have the=20
> following tuple like traits specializations for a POD struct C.
>
> template <>
> struct tuple_size<C> :=20
> size_t_constant<std::class_traits<C>::class_members::size> {};
>
> template <size_t N>
> struct tuple_element<N, C> :=20
> id<decltype(std::declval<C>().*declval<std::class_traits<C>::base_members=
::get<N>::pointer>())>=20
> {};
>
> template <size_t N>
> requires N < std::class_traits<C>::class_members::size
> constexpr tuple_element_t<N,C>& get(C & that) noexcept
> {
> std::class_traits<C>::base_members::get<N>::pointer pm;
>     return that.*pm;
> }
>
> template <size_t N>
> requires N < std::class_traits<C>::class_members::size
> constexpr const tuple_element_t<N,C>& get(const C & that) noexcept
> {
>     std::class_traits<C>::base_members::get<N>::pointer pm;
>     return that.*pm;
> }
>
> template <size_t N>
> requires N < std::class_traits<C>::class_members::size
> constexpr tuple_element_t<N,C>&& get(C && that) noexcept
> {
> std::class_traits<C>::base_members::get<N>::pointer pm;
>     return std::forward<tuple_element_t<N,C>&&>(that.*pm);
> }
>
> /// the same for get with a type
>
> However, I would like to do it for some more classes C1, C2, ...
>
> I have added a trait tuple_like that states if I want the generation
>
> template <class T>
> struct tuple_like: false_type {};
>
> but I don't see how to make the specialization conditional to this=20
> traits without adding an Enabler parameter
>
>     template <class T, class Enabler=3Dvoid>
> struct tuple_size;
>     template <size_t N, class T, class Enabler=3Dvoid>
>     struct tuple_element;
>
> Is there a way without changing the std::tuple_size and=20
> std::tuple_element template parameters?
> What would be the the correct way to do that?
>
> Vicente=20

--=20

---=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.
Visit this group at https://groups.google.com/a/isocpp.org/group/std-propos=
als/.

--------------070409020409080900010803
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<html>
  <head>
    <meta content=3D"text/html; charset=3Dutf-8" http-equiv=3D"Content-Type=
">
  </head>
  <body bgcolor=3D"#FFFFFF" text=3D"#000000">
    <div class=3D"moz-cite-prefix">Adding std-proposals<br>
      Vicente<br>
      <br>
      Le 20/12/2015 20:27, Vicente J. Botet Escriba a =C3=A9crit=C2=A0:<br>
    </div>
    <blockquote cite=3D"mid:56770133.7070701@wanadoo.fr" type=3D"cite">
      <meta http-equiv=3D"content-type" content=3D"text/html; charset=3Dutf=
-8">
      <font size=3D"+1">Hi, <br>
        <br>
      </font><font size=3D"+1"><c><font size=3D"+1">Based on the reflection
            traits</font></c></font><font size=3D"+1"><c><font size=3D"+1">
            from n4428</font></c></font><font size=3D"+1"><c><font
            size=3D"+1"><c> I would like to have the following </c></font><=
font
            size=3D"+1"><c><font size=3D"+1">tuple like traits
                specializations </font></c></font></c></font><font
        size=3D"+1"><c><font size=3D"+1"><c><font size=3D"+1"><font size=3D=
"+1">for
                  a POD struct C. </font><font size=3D"+1"><c><font
                      size=3D"+1"><br>
                    </font></c></font></font></c></font> <br>
          template &lt;&gt;<br>
          struct tuple_size&lt;C&gt; : size_t_constant&lt;</c></font><font
        size=3D"+1"><c>std::class_traits<c>&lt;C&gt;::class_members::size</=
c>&gt;


          {};<br>
          <br>
        </c></font><font size=3D"+1"><c><font size=3D"+1"><c>template
              &lt;size_t N&gt;<br>
              struct tuple_element&lt;N, C&gt; : id&lt;</c></font><font
            size=3D"+1"><c>decltype(std::declval&lt;C&gt;().*declval&lt;std=
::class_traits<c>&lt;C&gt;::base_</c></c></font></c></font><font
        size=3D"+1"><c><font size=3D"+1"><c><c><font size=3D"+1">members</f=
ont>::get&lt;N&gt;::pointer</c>&gt;())&gt;


              {};<br>
            </c></font></c></font><br>
      <font size=3D"+1"><c><font size=3D"+1"><font size=3D"+1">template
              &lt;size_t N&gt;<br>
              requires N &lt; </font></font></c></font><font size=3D"+1"><c=
><font
            size=3D"+1"><font size=3D"+1"><font size=3D"+1"><c>std::class_t=
raits<c>&lt;C&gt;::class_members::size<br>
                  </c></c></font>=C2=A0</font></font>constexpr
          tuple_element_t&lt;N,C&gt;&amp; get(C &amp; that) noexcept <br>
          {<br>
        </c></font><font size=3D"+1"><c><font size=3D"+1"><c><font size=3D"=
+1"><c>=C2=A0=C2=A0=C2=A0


                  std::class_traits<c>&lt;C&gt;::base_</c></c></font></c></=
font><font
            size=3D"+1"><c><font size=3D"+1"><c><c><font size=3D"+1">member=
s</font>::get&lt;N&gt;::pointer</c></c></font></c></font>
          pm; =C2=A0 </c></font><br>
      <font size=3D"+1"><c><font size=3D"+1">=C2=A0=C2=A0=C2=A0 return that=
</font>.*pm;<br>
          }<br>
        </c></font><br>
      <font size=3D"+1"><c><font size=3D"+1"><c><font size=3D"+1"><font
                  size=3D"+1">template &lt;size_t N&gt;<br>
                </font></font></c></font></c></font><font size=3D"+1"><c><f=
ont
            size=3D"+1"><c><font size=3D"+1"><c><font size=3D"+1"><font
                      size=3D"+1">requires N &lt; </font></font></c></font>=
<font
                size=3D"+1"><c><font size=3D"+1"><font size=3D"+1"><font
                        size=3D"+1"><c>std::class_traits<c>&lt;C&gt;::class=
_members::size<br>
                          </c></c></font></font></font></c></font>constexpr


              const tuple_element_t&lt;N,C&gt;&amp; get(</c></font></c></fo=
nt><font
        size=3D"+1"><c><font size=3D"+1"><c><font size=3D"+1"><font size=3D=
"+1">const


                </font></font>C &amp; that) noexcept <br>
              {<br>
            </c></font><font size=3D"+1"><c><font size=3D"+1"><c><font
                    size=3D"+1"><c>=C2=A0=C2=A0=C2=A0 std::class_traits<c>&=
lt;C&gt;::base_</c></c></font></c></font><font
                size=3D"+1"><c><font size=3D"+1"><c><c><font size=3D"+1">me=
mbers</font>::get&lt;N&gt;::pointer</c></c></font></c></font>
              pm; =C2=A0 </c></font><br>
          <font size=3D"+1"><c><font size=3D"+1">=C2=A0=C2=A0=C2=A0 return =
that</font>.*pm;<br>
              }<br>
            </c></font></c></font><br>
      <font size=3D"+1"><c><font size=3D"+1"><font size=3D"+1">template
              &lt;size_t N&gt;<br>
              requires N &lt; </font></font></c></font><font size=3D"+1"><c=
><font
            size=3D"+1"><font size=3D"+1"><font size=3D"+1"><c>std::class_t=
raits<c>&lt;C&gt;::class_members::size<br>
                  </c></c></font></font></font>constexpr
          tuple_element_t&lt;N,C&gt;&amp;&amp; get(C &amp;&amp; that)
          noexcept <br>
          {<br>
        </c></font><font size=3D"+1"><c><font size=3D"+1"><c><font size=3D"=
+1"><c>=C2=A0=C2=A0=C2=A0


                  std::class_traits<c>&lt;C&gt;::base_</c></c></font></c></=
font><font
            size=3D"+1"><c><font size=3D"+1"><c><c><font size=3D"+1">member=
s</font>::get&lt;N&gt;::pointer</c></c></font></c></font>
          pm; =C2=A0 </c></font><br>
      <font size=3D"+1"><c><font size=3D"+1">=C2=A0=C2=A0=C2=A0 return std:=
:forward&lt;</font></c></font><font
        size=3D"+1"><c><font size=3D"+1"><font size=3D"+1">tuple_element_t&=
lt;N,C&gt;</font>&amp;&amp;&gt;(that</font>.*pm);<br>
          }<br>
          <br>
          /// the same for get with a type<br>
          <br>
          However, I would like to do it for some more classes C1, C2,
          ...<br>
          <br>
          I have added a trait </c></font><font size=3D"+1"><c><font
            size=3D"+1"><font size=3D"+1">tuple_like </font></font>that
          states if I want the generation <br>
        </c></font><br>
      <font size=3D"+1"><font size=3D"+1">template &lt;class T&gt;<br>
          struct tuple_like: false_type {};<br>
        </font></font><br>
      <font size=3D"+1">but I don't see how to make the specialization
        conditional to this traits without adding an Enabler parameter<br>
        <br>
      </font><font size=3D"+1"><c><font size=3D"+1">=C2=A0=C2=A0=C2=A0 temp=
late &lt;class
            T, class Enabler=3Dvoid&gt;<br>
          </font></c></font><font size=3D"+1"><c><font size=3D"+1">=C2=A0=
=C2=A0=C2=A0
            struct tuple_size;<br>
          </font></c></font><font size=3D"+1"><c><font size=3D"+1"><font
              size=3D"+1"><font size=3D"+1">=C2=A0=C2=A0=C2=A0 template &lt=
;size_t N, </font></font></font></c></font><font
        size=3D"+1"><c><font size=3D"+1"><font size=3D"+1"><font size=3D"+1=
"><font
                  size=3D"+1"><font size=3D"+1">class T, class Enabler=3Dvo=
id</font></font>&gt;<br>
                =C2=A0=C2=A0=C2=A0 struct tuple_element;<br>
                <br>
              </font></font></font></c></font><font size=3D"+1"><c><font
            size=3D"+1">Is there a way without changing the
            std::tuple_size and </font></c></font><font size=3D"+1"><c><fon=
t
            size=3D"+1"><font size=3D"+1"><font size=3D"+1">std::</font></f=
ont>tuple_element

            template parameters?<br>
          </font></c></font><font size=3D"+1"><c><font size=3D"+1"><font
              size=3D"+1"><c>What would be the the correct way to do that?<=
/c></font><font
              size=3D"+1"><c><br>
              </c></font><font size=3D"+1"><c></c></font> <br>
            Vicente</font></c></font> </blockquote>
    <br>
  </body>
</html>

<p></p>

-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals&quot; group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"https://groups.google.com/a/isocpp.org/group=
/std-proposals/">https://groups.google.com/a/isocpp.org/group/std-proposals=
/</a>.<br />

--------------070409020409080900010803--

.
