tail const

Steven Schveighoffer schveiguy at yahoo.com
Fri Dec 3 18:25:01 PST 2010


On Fri, 03 Dec 2010 21:19:14 -0500, Michel Fortin  
<michel.fortin at michelf.com> wrote:

> On 2010-12-03 21:02:10 -0500, "Steven Schveighoffer"  
> <schveiguy at yahoo.com> said:
>
>> On Fri, 03 Dec 2010 20:40:23 -0500, Michel Fortin   
>> <michel.fortin at michelf.com> wrote:
>>
>>> I have an idea that would fix those: make a template struct/class   
>>> instance implicitly convertible to another instance of that same   
>>> template if all members share the same memory layout and each member  
>>> is  implicitly convertible to the same member of the other template.
>>  I had thought of that too, a long time ago, but I wasn't sure if it  
>> could  work.  I'd go two steps further:
>>  1. all the member variable names must be identical.
>> 2. you need to identify that implicit conversion is allowed.
>>  1 is for sanity ;)
>>  struct Pair(T)
>> {
>>     T x;
>>     T y;
>> }
>>  struct ConstPair(T)
>> {
>>     const(T) y;
>>     const(T) x;
>> }
>>  2 is to ensure you are not able to incorrectly morph data into things  
>> it  should not be.  i.e.:
>>  struct Point
>> {
>>    int x;
>>    int y;
>> }
>>  I don't think you should be able to implicitly cast Pair!int to  
>> Point,  sometimes you want to define different APIs for the same data.
>
> Just like you, I don't think you should be able to implicitly cast  
> Pair!int to Point.
>
> What I was suggesting is that the implicit cast would work only as long  
> as the struct/class instance comes from the same template definition.  
> That'd actually make Pair!int and Pair!uint convertible between each  
> other (because int and uint are implicitly converted from one another)  
> but ConstPair, which originate from a different template definition,  
> wouldn't be convertible from Pair. Instead of defining ConstPair, you'd  
> use Pair!(const(T)) to denote a pair of const elements, and because T is  
> convertible to const(T), Pair!T is also convertible to  
> Pair!(const(T))... as long as the memory layout is preserved, of course.

Oh, I misread your original idea, sorry.  I like the idea.

I just think it should be explicit that the 'same memory layout' means the  
names of the variables are the same.  I just think of bizarre cases where  
static ifs are used to confuse things.

-Steve


More information about the Digitalmars-d mailing list