std.conv - custom string to struct conversion ?

monarch_dodra monarchdodra at gmail.com
Fri Aug 2 02:59:10 PDT 2013


On Friday, 2 August 2013 at 09:11:26 UTC, Jonathan M Davis wrote:
> On Friday, August 02, 2013 10:35:22 monarch_dodra wrote:
>> On Friday, 2 August 2013 at 07:59:59 UTC, Jonathan M Davis 
>> wrote:
>> > On Friday, August 02, 2013 08:40:51 monarch_dodra wrote:
>> >> There was a request for enhancement to provide a 
>> >> "fromString"
>> >> for
>> >> arbitrary types. The idea is that once we have that, then
>> >> functions such as parse or to!S(string) will be generic, and
>> >> work
>> >> on mostly anything. Unfortunatly, (AFAIK), nobody is 
>> >> working on
>> >> this.
>> >> 
>> >> Here is a discussion I opened:
>> >> http://forum.dlang.org/thread/gzodptjyzpqnhxctbbuv@forum.dlang.org
>> >> 
>> >> ...and I just noticed it ends with me saying "I'll try to
>> >> write a
>> >> DIP then :)" and then not doing it :/
>> > 
>> > What's the point of fromString when a constructor will do the
>> > job just fine?
>> > 
>> > - Jonathan M Davis
>> 
>> Really? Because it's not generic. Unless I'm missing something,
>> I'm sure you can appreciate that the goal is to allow:
>> 
>> to!S("string")
>
> As long as S defines a constructor which takes a string, this 
> works just fine.
> All fromString would be doing would be to declare a function 
> which did the
> same thing as the constructor.

Right. That's what to! does. In that case, I'll correct myself, 
and say:

parse!S("string")

wouldn't work.

>> or
>> myFile.readf("Entry: %s", &s);
>> 
>> And a simple constructor doesn't (*CAN'T*) allow that.
>
> Really? All it would have to do wolud be to pass the string 
> that is the user
> input into the constructor for typeof(s) and set s to that.
>
> - Jonathan M Davis

It wouldn't because "myFile.readf("Entry: %s %s", &s, &s);" 
wouldn't know *what* to pass to the constructor. AFAIK. I could 
be wrong.

Regardless, a constructor can only be explicit, whereas a generic 
"fromString" can be implemented by default for structs, just the 
same way you don't ask users to write a toString.

Given:

struct Person
{
   string name;
}

Then:
parse!Person(`Person("Jonathan")`);
Should "just work".

Finally, a constructor is meant to construct an object, and not 
unserialize it. There could be notable differences in both.

auto myName = to!Person("Jonathan"); //Fine
parse!Person(`Person("Jonathan")`);

As you can see, the strings don't match. A constructor may not be 
the reciprocal of toString. You simply *can't* call a constructor 
in a parse operation.


More information about the Digitalmars-d-learn mailing list