On Sun, 19 Jun 2011 09:20:17 -0400, Andrei Alexandrescu
<[email protected]> wrote:
On 6/18/11 5:42 PM, Jonathan M Davis wrote:
On 2011-06-18 06:35, Andrei Alexandrescu wrote:
On 6/18/11 4:59 AM, Jonathan M Davis wrote:
I'll look at renaming toUTF16z to toWStringz to match toStringz (as
was
suggested by a couple of people in this thread)
That should be a template toUTFz that takes either char*, wchar*, or
dchar*.
A good point. Are you arguing that toStringz should be replaced by such
a
construct? Or that it should simply exist in addition to toStringz?
Also, we _could_ make it so that such a template would take the
mutabality of
the pointer as well (e.g. toUTF!(char*)(str), toUTF!(const(char)*),
etc.),
which would allow it to be used in cases where you actually want a
mutable
string (which toStringz doesn't do).
- Jonathan M Davis
I think that's a good idea, which would address that StackOverflow
problem too.
The way I'd probably suggest we go about it is as a universal
transcoder. Define std.conv.to with strings of any width and
qualification as input and with pointers to characters of any width as
output. It is implied that the conversion entails adding a terminating
zero.
string a = "hello";
auto p = to!(wchar*)(a); // change width and qualifier
I don't like relying on an implication is a zero character is added. A
char * pointer may or may not be zero terminated (that is one of the
issues with C), so you can't really designate a type to mean "zero
terminated".
The name (whatever it is) should indicate that a zero terminator is added.
Simply because someone could see:
string a = "hello";
auto p = to!(const(char)*)(a);
and think "hm.. what a waste! I'll just change that to a.ptr," not
realizing the harm he is doing (and this might actually pass unit tests
too!).
I like toUTFz. Along with aliases for toStringz, toWStringz, and
toDStringz.
-Steve