Titanion 0.4 + Phobos2 bug

Robert Jacques sandford at jhu.edu
Tue Apr 28 08:06:12 PDT 2009


On Tue, 28 Apr 2009 05:06:23 -0400, bearophile <bearophileHUGS at lycos.com>  
wrote:

> bearophile:
>> struct Vec(T=float, size_t N=3) {
>>     static assert(N > 0);
>
> Sorry. Better to use:
>
>> struct Vec(T=float, int N=3) {
>>     static assert(N > 0);
>
> From experience using D I have seen that using unsigned types is very  
> unsafe in the current D language. In Delphi using unsigned types  
> increases safety, in D actually decreases it. So in D it's better avoid  
> unsigned type every time they aren't strictly necessary.
>
> Bye,
> bearophile

Well, in this case, N=-1 is both a compile time constant and doesn't  
compile (static arrays have a max size of 16kb).

Anyways, here's an alternate version:
import std.conv: text;
struct _Vec(T:U[N],U,size_t N) {
     T _data;
     alias _data this;
     string toString() { return text(_data); }
}

_Vec!(T) Vec(T)(T val)
     if( is(_Vec!(T)) )
{
     _Vec!(T) r = val;
     return r;
}

Which simplifies use:

auto foo(T,size_t N)(T[N] v) {
     // do stuff with v
     return Vec(v);
}

although functions as array parameters doesn't allow setters, i.e.:
pos.x;     // okay
pos.x = 5; // error


More information about the Digitalmars-d-announce mailing list