How do you use templates in D?
Ali Çehreli
acehreli at yahoo.com
Tue Oct 18 15:37:08 PDT 2011
On Tue, 18 Oct 2011 17:56:33 -0400, Jonathan M Davis wrote:
> On Tuesday, October 18, 2011 12:32 Ali Çehreli wrote:
>> On Tue, 18 Oct 2011 13:56:09 -0400, Andrew Pennebaker wrote:
>> > I'm writing a function called genArray that accepts a function gen
>> > and returns a random array populated by calling gen(). genString
>> > builds on this by returning genArray(&genChar). But my type
>> > signatures are wrong.
>> >
>> > In dashcheck.d:
>> >
>> > char genChar() {
>> >
>> > return cast(char) uniform(0, 128);
>>
>> It's a good thing that you are staying within ASCII. Otherwise there
>> might be invalid UTF-8 sequences. :)
>
> Yeah. It's generally a very bad sign when code uses char or wchar
> outside of arrays. They're UTF-8 and UTF-16 code units respectively and
> are not necessarily full code points (and therefore are not necessarily
> full characters). That's particularly true of char, since anything
> outside of ASCII is not going to work. Code which operates on individual
> characters really should be operating on dchars, not chars or wchars.
Good tips, but we can further qualify "Code which operates on individual
characters". I think you imply accessing individual characters, likely
with the [] operator.
It is perfectly fine to use char and wchar strings as ranges when
std.array is imported (it is automatically imported by std.range too):
import std.stdio;
import std.range;
import std.array; // <-- empowers (en-ranges :p) char and wchar strings
void main()
{
writeln(take("abcçdeé", 5));
}
Outputs 5 Unicode characters, not code units.
In other words, e.g. .front on any type of string produces a dchar; and
that may very well prove your point. ;)
> - Jonathan M Davis
Ali
More information about the Digitalmars-d
mailing list