Templates variables
hi..
Just a quick stupid question. I''ve been thinking of changing my 3D vector class to templated one so I don''t have to write a 2D and 4D one. But I have one problem with it. For verctor values I use union like :
union {
struct {
float x,y,z;
}
float v[3];
}
Now the trouble is if I change this to templated verison I can''t use slomething like myVector.y = 5; but I have to write myVector.v[1] = 5;
Is there any way I could use templates and still use .x notation?
You should never let your fears become the boundaries of your dreams.
quote:Original post by _DarkWIng_
hi..
Just a quick stupid question. I''ve been thinking of changing my 3D vector class to templated one so I don''t have to write a 2D and 4D one. But I have one problem with it. For verctor values I use union like :
union {
struct {
float x,y,z;
}
float v[3];
}
Now the trouble is if I change this to templated verison I can''t use slomething like myVector.y = 5; but I have to write myVector.v[1] = 5;
Is there any way I could use templates and still use .x notation?
You should never let your fears become the boundaries of your dreams.
damn right!
well, u are right, this should be possible, but c++ makes it rather hard.
here is a 2 ideas:
1)
you could cast you float[1/2/3/4] into a struct vector{float x, y, z, w;}; and just be careful u dont dereference the w of a float[2] (->SIGSEV).
2)
subclass, use an abstract class to combine all that the vectors have in common (also operations like dot product, crossproduct, norm etc.) an then u soubclass with classes that explicitely store the values in named variables
in both approaches you get a problem when you have arrays, coz the compiler might assume the wrong size of the struct (or just refuse to compile), with the abstract class approach this is more subtle though and you might find a way around.
good luck
daniel
daniel@maddanio.toastbrot.ch
You could have functions X() Y() etc that return a reference to the appropriate entry in the array.
float& Y() { return v[1]; }
float& Y() { return v[1]; }
You could partially specialize (i.e. doesn''t work on MSVC6):
template<typename T, int N>struct vector { Float v[N]; Float& operator[](size_t i) {return this->v[i];} const Float& operator[](size_t i) const {return this->v[i];} };template<typename T>struct vector<T, 2> { union { struct { Float x,y; }; Float v[2]; }; Float& operator[](size_t i) {return this->v[i];} const Float& operator[](size_t i) const {return this->v[i];} };template<typename T>struct vector<T, 3> { union { struct { Float x,y,z; }; Float v[3]; }; Float& operator[](size_t i) {return this->v[i];} const Float& operator[](size_t i) const {return this->v[i];} };template<typename T>struct vector<T, 4> { union { struct { Float w,x,y,z; }; Float v[4]; }; Float& operator[](size_t i) {return this->v[i];} const Float& operator[](size_t i) const {return this->v[i];} };
Magmai Kai Holmlor : hmmm.. I''ll try the template specialization. I did''t know you could "override" whole class definition, I tought you could just change function definitions. I just hope it will work.
AP : I dont'' realy understand what do you mean by #2. I should cast where?
One other question (a bit unrelated): Is there a speed difference if I use this->x inside member functions instead of this->v[0]. Let''s say in dot product I have
return x*x+y*y+z*z;
will this be compiled different than
return v[0]*v[0]+v[1]*v[1]+v[2]*v[2];
or will compiler optimize it to same thing?
You should never let your fears become the boundaries of your dreams.
AP : I dont'' realy understand what do you mean by #2. I should cast where?
One other question (a bit unrelated): Is there a speed difference if I use this->x inside member functions instead of this->v[0]. Let''s say in dot product I have
return x*x+y*y+z*z;
will this be compiled different than
return v[0]*v[0]+v[1]*v[1]+v[2]*v[2];
or will compiler optimize it to same thing?
You should never let your fears become the boundaries of your dreams.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement