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/gzodptjyzpqnhxctb...@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.