Problem about Tuple.opEquals, const qualifier

Ali Çehreli acehreli at yahoo.com
Sat Mar 17 23:15:15 PDT 2012


On 03/17/2012 09:02 PM, Tongzhou Li wrote:
 > On Saturday, 17 March 2012 at 23:05:30 UTC, Simen Kjærås wrote:
 >> As for a workaround, have you considered using a simple array instead
 >> of a linked list?
 >> Arrays in D, especially when combined with std.array, make for
 >> easy-to-use (though
 >> perhaps not particularly efficient) stacks:
 >>
 >> int[] stack;
 >>
 >> stack ~= 3; // Push
 >> stack = stack[0..$-1]; // Pop
 >> stack.popBack(); // Pop with std.array
 >
 > Another problem. I wrote:
 > Tuple!(double, char)[] stack;
 > stack ~= tuple(10, '+');
 > It won't compile:
 > Error: cannot append type Tuple!(int,char) to type Tuple!(double,char)[]

Every template instantiation of a set of template parameters becomes a 
distinct type than any other set of template parameters.

In other words, Tuple!(double, char) and Tuple!(int, char) are distinct 
types. For all the compiler knows, Tuple is a user type and only the 
user should define whether they are compatible. Tuple does not define 
opCast() to covert from Tuple!(int,char) to Tuple!(double,char). I guess 
it could have been defined. (?)

A solution is to explicitly perform the conversion:

import std.conv;
// ...
     stack ~= to!(Tuple!(double, char))(tuple(10, '+'));

(An alias would make that easier to read. :/).

 > I also tried:
 > Tuple!(double, "Num", char, "Oper")[] stack;
 > stack ~= tuple(10.0, '+');
 > I also got an error:
 > Error: cannot append type Tuple!(double,char) to type
 > Tuple!(double,"Num",char,"Oper")[]

That's the same reason as above.

 > But I tried:
 > Tuple!(double, "Num", char, "Oper") t;
 > t = tuple(10, 'a');
 > It does compile.
 > I don't understand why...

That's different because this time there is no slice involved. The 
assignment is done on t itself. Tuple defines opAssign() that 
effectively performs the following operations (calling the right-hand 
side object 'temp'):

t[0] = temp[0];
t[1] = temp[1];

And that succeeds because int can implicitly be converted to double.

Ali



More information about the Digitalmars-d-learn mailing list