Passing a generic struct as parameter

Zardoz luis.panadero at gmail.com
Fri Jul 1 00:07:20 PDT 2011


Thanks. I imagined something similar, that "Vector" alone not is type.
How I can templatize opIndexAssign function ? I tried this :

void opIndexAssign(U)(U v, size_t j) {
  col[j] = v;
}

And I get a error : 
Error: template zmath.matrix.Matrix!(float,2).Matrix.opIndexAssign(U) conflicts with function 
zmath.matrix.Matrix!(float,2).Matrix.opIndexAssign at src/matrix.d(261)

That I interpret that this opIndexAssign clash with other opIndexAssign that I have to direct access to 
matrix  cells
void opIndexAssign(T c, size_t row, size_t cl) {
	col[cl][row] = c;
}

I said before that I made a opCast for Vector ?

On Fri, 01 Jul 2011 00:12:43 +0000, Jonathan M Davis wrote:

> On 2011-06-30 16:39, Zardoz wrote:
>> I have a parametrized struct (Vector!(T, dim)) that takes two
>> parameters (Type and a number). And made some Alias with defaults
>> parameters.
>> 
>> In other struct (Matrix!(T, dim)), that uses these struct to represent
>> a matrix in column-major order. I have a internall alias for Vector
>> using internally (alias Vector!(T,dim_) VCol;) . The problem that I
>> have it's when I try to use opIndexAssign to assign to a column a
>> Vector. I try this :
>> 
>> void opIndexAssign(Vector v, size_t j) { if ( code that see if VCol if
>> same type that v ) { col[j] = v;
>> } else {
>> col[j] = cast (VCol) v;
>> }
>> }
>> 
>> But not compile... I get this error : Error: struct
>> zmath.vector.Vector(T,ulong dim_) if (__traits (isFloating,T)) is used
>> as a type
>> Error: template instance zmath.matrix.Matrix!(float,2) error
>> instantiating
>> 
>> So finally I try this :
>> /**
>> * Assigns a new column vector
>> */
>> void opIndexAssign(VCol v, size_t j) { col[j] = v;
>> }
>> 
>> But now I must do cast outside, even knowing that are same type. Plus
>> now I must keep VCol alias public.
>> 
>> How should fix this, or What is the correct way of doing this ?
>> 
>> 
>> Note : I have a opCast for Vector that cast between Vectors with
>> different parameters and it's checked that works.
>> 
>> Second Question : I'm thinking publish this small Vector/Quaternion/
>> Matrix lib that I made learning D2.. where I should put and how ? (and
>> I use Git)
> 
> The first thing that you need to understand is that Vector is not a
> type. It does not exist. Vector!(int, 4) is a type. Vector!(float, 3) is
> a type. Vector is not. Vector is a template for a type. When you use a
> template, you instantiate it for a particular set of arguments, and that
> creates a new type. An instantiation of a templated type such as Vector
> is a type, and every instantiation is its own, separate type which has
> no connection with any other instantion of that template. So, it makes
> no sense for a function to take a Vector (though within the Vector
> template that works, because Vector stands for that particular
> instantiation inside of the Vector template). If you want a function to
> take multiple instantiations of a template, then you need to templatize
> the function. If you want it to take a particular instantiation of a
> template, then you give its parameter that exact template instantiation.
> 
> Now, if you want two separate instantions (such as Vector!(int, 3) and
> Vector! (float, 3)) to interact, you're going to need to either write
> opCasts to cast between them or have templated functions which are
> templated on both of their types (e.g. func(V1, V2)(V1 vector1, V2
> vector2) {...}). They are two completed different types, just like if
> you created IntVector and FloatVector, so you have to write code which
> allows them to interact. They aren't going to just work together because
> they came from the same template.
> 
> - Jonathan M Davis





-- 
Yep, I'm afraid that I have a blog : zardoz.es


More information about the Digitalmars-d-learn mailing list