C++ Logo

std-proposals

Advanced search

Re: Template qualifiers

From: Phil Bouchard <phil_at_[hidden]>
Date: Sun, 29 Sep 2019 16:50:59 -0400
[Please CC my personal email address in the replies otherwise I'll can't
properly follow-up]


So let's take a better example:


template <typename T>

     struct construct<T>

     {

         // Let the compiler generate the most efficient code

         template <qualifier Q>

             inline T Q operator () (node_proxy & __y, T Q po)

             {

                 return T(po);

             }

     };

struct ConstClass

{

     constexpr ConstClass() {}

};

struct NonConstClass

{

     NonConstClass() {}

};


// This will result in:

construct<ConstClass>()(ConstClass()); // constexpr expression

construct<NonConstClass>()(NonConstClass()); // not a constexpr expression


Thus qualifiers would be:

<nothing> (copy)

const

volatile

const volatile

const &

volatile &

const volatile &

<nothing> (copy) constexpr

const constexpr

volatile constexpr

const volatile constexpr

const constexpr &

volatile constexpr &

const volatile constexpr &

&&


Why the need? Because otherwise we can't have unique and syntactic sugar
functions to handle all possibilities efficiently.


-- 
*Phil Bouchard*
Founder
C.: (819) 328-4743
Fornux Logo <http://www.fornux.com>
On 9/29/19 2:48 PM, Tony V E wrote:
> Is there some reason to use assignment as your example? It seems a 
> strange example, since we don't normally assign to const objects, nor 
> build assignments that don't assign.
>
> Maybe a more motivating and less distracting example would be better.
>
> Sent from my BlackBerry portable Babbage Device
> *From: *Phil Bouchard via Std-Proposals
> *Sent: *Sunday, September 29, 2019 8:52 AM
> *To: *std-proposals_at_[hidden]
> *Reply To: *std-proposals_at_[hidden]
> *Cc: *Phil Bouchard
> *Subject: *[std-proposals] Template qualifiers
>
>
> Greetings,
>
>
> How many time did we have to redundantly write the same member 
> functions just to add a const version? Ex.:
>
> struct A
>
> {
>
>     A & operator = (A const &) { return * this; }
>
>     A const & operator = (A const &) const { return * this; }
>
> };
>
>
> What I would like to suggest would be to templatize those instances as 
> such:
>
> struct A
>
> {
>
>     template <qualifier Q>
>
>         A Q & operator = (A const &) Q { return * this; }
>
> };
>
>
> This would in instantiate on-the-fly the 2 (or 4) versions of the same 
> code.
>
>
> Thank you,
>
> -- 
>
> *Phil Bouchard*
> Founder
> C.: (819) 328-4743
>
> Fornux Logo <http://www.fornux.com>
>

Received on 2019-09-29 15:53:11