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

Reply via email to