On 30.09.2010 22:01, Philippe Sigaud wrote:

To me, your constructor's signature is saying: "give me any number of
T[N]", which I guess is not what you want. You want exactly N T's.

You're right, I want exactly N T's, but from reading the section about "Typesafe Variadic Functions" at [1], I thought I'm doing exactly that. The example "For static arrays" has a comment which says for a declaration like

int sum(int[3] ar ...)

this

return sum(2, 3); // error, need 3 values for array

would not work, so I thought "...", if following a statically sized array, is a special syntax to allow the array to be initialized from exactly N scalar values.

In fact, I checked that with my code

auto v=Vec3f(1,0,0);

compiles, but

auto v=Vec3f(1,0);
auto v=Vec3f(1,0,0,0);
auto v=Vec3f([1,0,0],[1,0,0]);

do not compile, just as desired. So I thought I'm doing the right thing :-)

Which gives the following constructor:

this(U...)(U v) if (U.length<= N&&  is(CommonType!U : T))
{
     data = [v];
}

Well, this makes sense, thank you. I'm just wondering if my solution is any less safe?

Btw, "alias N" is a bit dangerous: N could be any symbol. As you use
it as a size, let's give it a size type:  Vector(int N, T) or
Vector(size_t N, T).
Also, T data[N]; is using a C syntax. In D, the idiomatic syntax is T[N] data;
And there is no need for a semicolon at the end of a struct
definition: the compiler knows it ends there.

Thanks for all the hints!

It's doable, but it means modifying your struct a bit: instead of
holding the values in an array, you can store them in a tuple.
I'll see if anyone as another idea: I'm biased towards tuples.

With tuples, would it still be that sizeof(Vector)==sizeof(T)*N?

[1] http://www.digitalmars.com/d/2.0/function.html

--
Sebastian Schuberth

Reply via email to