syntax for calling to with a getter as source argument

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jul 14 17:10:12 PDT 2014


On 07/14/2014 04:04 PM, H. S. Teoh via Digitalmars-d-learn wrote:

 > On Mon, Jul 14, 2014 at 09:12:30PM +0000, Klb via Digitalmars-d-learn 
wrote:
 >> hello what is the right syntax for this:
 >>
 >> ----------------------------------------------------
 >> import std.stdio, std.conv;
 >>
 >> void main(string args[])
 >> {
 >>      ubyte[3] src = [0, 1, 2];
 >>      string trg = "";
 >>
 >>      @property ubyte[3] srcAsProp(){return src;}
 >>
 >>      // Error: template std.conv.to cannot deduce function from 
argument types
 >>      // !(string)(ubyte[3]), candidates are:
 >>      trg = to!(string)(srcAsProp());
 >> }
 >> ----------------------------------------------------
 >>
 >> In a real-world application I'd use an intermediate value but I'd like
 >> to know If it's possible...The strange fact is that it doesn't trig an
 >> error if src is a dyn. array. (if you remove the 3 from [3] then it
 >> passes).
 >
 > You need to slice the static array:
 >
 > 	trg = to!string(srcAsProp()[]);

There seems to be an attempt in Phobos to support it without needing an 
explicit slice.

 From std/phobos/conv.d:

/*
   Converting static arrays forwards to their dynamic counterparts.
  */
T toImpl(T, S)(ref S s)
     if (isRawStaticArray!S)
{
     return toImpl!(T, typeof(s[0])[])(s);
}

@safe pure nothrow unittest
{
     char[4] test = ['a', 'b', 'c', 'd'];
     static assert(!isInputRange!(Unqual!(char[4])));
     assert(to!string(test) == test);
}

I don't know why that overload does not take care of OP's case. (I am be 
completely off here. :) )

Ali



More information about the Digitalmars-d-learn mailing list