Auto-casting in range based functions?
Artur Skawina
art.08.09 at gmail.com
Sun May 13 11:31:25 PDT 2012
On 05/13/12 19:49, Andrew Stanton wrote:
> I have been playing around with D as a scripting tool and have been running into the following issue:
>
> -----------------------------------
> import std.algorithm;
>
> struct Delim {
> char delim;
> this(char d) {
> delim = d;
> }
> }
>
> void main() {
> char[] d = ['a', 'b', 'c'];
> auto delims = map!Delim(d);
> }
>
> /*
> Compiling gives me the following error:
> /usr/include/d/dmd/phobos/std/algorithm.d(382): Error: constructor test.Delim.this (char d) is not callable using argument types (dchar)
> /usr/include/d/dmd/phobos/std/algorithm.d(382): Error: cannot implicitly convert expression ('\U0000ffff') of type dchar to char
>
> */
>
> -----------------------------------
>
> As someone who most of the time doesn't need to handle unicode, is there a way I can convince these functions to not upcast char to dchar? I can't think of a way to make the code more explicit in its typing.
Well, if you don't want/need utf8 at all:
alias ubyte ascii;
int main() {
ascii[] d = ['a', 'b', 'c'];
auto delims = map!Delim(d);
//...
and if you want to avoid utf8 just for this case (ie you "know" 'd[]'
contains just ascii) something like this should work:
char[] d = ['a', 'b', 'c'];
auto delims = map!((c){assert(c<128); return Delim(cast(char)c);})(d);
(it's probably more efficient when written as
auto delims = map!Delim(cast(ascii[])d);
but you loose the safety checks)
artur
More information about the Digitalmars-d-learn
mailing list