why is this cast necessary?
Graham Fawcett
fawcett at uwindsor.ca
Tue Jun 8 06:12:43 PDT 2010
Hi Steve,
On Mon, 07 Jun 2010 23:46:40 -0400, Steven Schveighoffer wrote:
> On Mon, 07 Jun 2010 23:02:48 -0400, Graham Fawcett <fawcett at uwindsor.ca>
> wrote:
>
>> Hi folks,
>>
>> This program works as expected in D2:
>>
>> import std.stdio;
>> import std.algorithm;
>>
>> T largestSubelement(T)(T[][] lol) {
>> alias reduce!"a>b?a:b" max;
>> return cast(T) max(map!max(lol)); // the cast matters...
>> }
>>
>> void main() {
>> auto a = [[1,2,3],[4,5,6],[8,9,7]];
>> assert (largestSubelement(a) == 9);
>>
>> auto b = ["howdy", "pardner"];
>> assert (largestSubelement(b) == 'y');
>>
>> auto c = [[1u, 3u, 45u, 2u], [29u, 1u]];
>> assert (largestSubelement(c) == 45u);
>> }
>>
>> But if I leave out the 'cast(T)' in line 7, then this program will not
>> compile:
>>
>> lse.d(6): Error: cannot implicitly convert expression
>> (reduce(map(lol))) of type dchar to immutable(char)
>> lse.d(14): Error: template instance
>> lse.largestSubelement!(immutable(char)) error
>> instantiating
>>
>> Where did the 'dchar' came from? And why does the cast resolve the
>> issue?
>
> In a recent update, Andrei changed char[] and wchar[] to bi-directional
> ranges of dchar instead of straight arrays (at least, I think that was
> the change) in the eyes of the range types. I think this is where the
> dchar comes from.
>
> If you had a char[], and the 'max' element was a sequence of 2 code
> points, how do you return a single char for that result?
Thank you. This makes sense.
Regards,
Graham
More information about the Digitalmars-d-learn
mailing list