Template Base Classes, Refering to typeof(this)

Travis Boucher boucher.travis at gmail.com
Wed Nov 4 12:31:16 PST 2009


Robert Jacques wrote:
> On Wed, 04 Nov 2009 13:35:45 -0500, Travis Boucher 
> <boucher.travis at gmail.com> wrote:
> 
>> I am writing a generic vector base class.  The class implements all of 
>> the operator overloads so I don't have to implement them over and over 
>> and over for each type of vector class.
>>
>> class VectorBase(size_t S, T) {
>>     T[S] data;
>>
>>     ...
>> }
>>
>> class Vector3f : VectorBase!(3, float) { ... }
>>
>> The problem I am having is implementing operations that can take a 
>> matching vector.  I can't figure out the proper way of declaring the 
>> type of input.
>>
>> eg.
>>
>> void opAssign(VectorBase!(S, T) r);
>>  > function VectorBase!(3LU,float).VectorBase.opAssign identity 
>> assignment operator overload is illegal
>>
>>
>> void opAssign(this r);
>>  > basic type expected, not this
>>
>>
>> The only way I can think of handling it is to add another parameter to 
>> the template declaration, eg:
>>
>> class VectorBase(size_t S, T, N) { ... }
>> class Vector3f : VectorBase!(3, float, Vector3f) { ... }
>>
>> But I would like to avoid that if possible.
>>
>> Any hints on how to implement this so I can keep my original 
>> declaration? class VectorBase(size_t S, T)
> 
> Well first, you can't overload assignment of a class to it's own type.

Ok, that makes sense, since an object is just a reference, so an 
assignment is really just a pointer copy, not a data copy, correct?

> (It's part of the language spec, at the bottom of the operator overload 
> page IIRC) Second, I've already solved this in D2, (using structs) so 
> let me know if you want code. 

Yeah, I'd be interested.  I am currently running gdc with D1, but I did 
see some notes on getting gdc working with D2.

> Third, fixed sized arrays as value-type 
> are coming in the next release (I think), so you could wait for that. 
> Lastly, you're (probably) going to run into issues with your other 
> operator overloads because of some bugs in instantiating templates 
> inside of templates using template literals as opposed to types.

Do you have any hints on what to look out for?  I did implement a Vector 
class template, passing in a template parameter to refer to the 
instantiated type.  It used mixins.

eg.
class VectorBase(size_t S, T, N) { ... }
class Vector3f {mixin VectorBase!(3, float, Vector3f); }

It compiled and worked for the basic tests, including all operator 
overloading.

auto a = new Vector3f();
auto b = new Vector3f(1, 2, 3);
auto c = b * 2; // c = Vector3f(2, 4, 6)
auto d = b + c; // d = Vector3f(3, 6, 9)

I didn't run into any bugs, and even more complex methods (explict 
methods) returned valid results (eg. T dotProduct(N vec) { ... }).



More information about the Digitalmars-d mailing list