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:19:14 PDT 2014


On 07/14/2014 05:10 PM, Ali Çehreli wrote:

 > 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:

I meant phobos/std/conv.d there.

 > /*
 >    Converting static arrays forwards to their dynamic counterparts.
 >   */
 > T toImpl(T, S)(ref S s)
 >      if (isRawStaticArray!S)

Ok, I think I see now (after two minutes after posting it :) ) why it 
doesn't work. The overload above takes by-ref, which does not bind to 
rvalues in D.

And the problem is, what srcAsProp() returns is an rvalue because static 
arrays are value-types and they get copied.

 > {
 >      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. :) )

I hope I have it now. :p

Ali



More information about the Digitalmars-d-learn mailing list