www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Operator Overloading with class template

reply "Eyyub" <eyyub.pangearaion gmail.com> writes:
Hello,

How can I rewrite the exemple 2 (http://pastebin.com/q50903Zh) in 
D lang. ?
This source code doesn't work...why ?
http://paste.pocoo.org/show/wy1kDIpqTi2ApRuOxRRb/

Thx. :)
Apr 08 2012
next sibling parent "Francois Chabot" <francois.chabot.dev gmail.com> writes:
On Sunday, 8 April 2012 at 23:14:33 UTC, Eyyub wrote:
 Hello,

 How can I rewrite the exemple 2 (http://pastebin.com/q50903Zh) 
 in D lang. ?
 This source code doesn't work...why ?
 http://paste.pocoo.org/show/wy1kDIpqTi2ApRuOxRRb/

 Thx. :)

As far as I know, there is nothing special about themplate classes with regards to operator overloading, so you can follow the examples in there: http://dlang.org/operatoroverloading.html which in your example would yield: Matrix opOpAssign(string op)( Matrix rhs ) { for( size_t i =0 ; i < M ; ++i ) { for( size_t j =0 ; j < N ; ++j ) { mixin("array_[i*N+j]" ~ op ~ " rhs.array_[i*N+j] ;") ; } } } Bonus! all ...= operators implemented at once!
Apr 08 2012
prev sibling next sibling parent "Francois Chabot" <francois.chabot.dev gmail.com> writes:
On Sunday, 8 April 2012 at 23:41:51 UTC, Francois Chabot wrote:
 On Sunday, 8 April 2012 at 23:14:33 UTC, Eyyub wrote:
 Hello,

 How can I rewrite the exemple 2 (http://pastebin.com/q50903Zh) 
 in D lang. ?
 This source code doesn't work...why ?
 http://paste.pocoo.org/show/wy1kDIpqTi2ApRuOxRRb/

 Thx. :)

As far as I know, there is nothing special about themplate classes with regards to operator overloading, so you can follow the examples in there: http://dlang.org/operatoroverloading.html which in your example would yield: Matrix opOpAssign(string op)( Matrix rhs ) { for( size_t i =0 ; i < M ; ++i ) { for( size_t j =0 ; j < N ; ++j ) { mixin("array_[i*N+j]" ~ op ~ " rhs.array_[i*N+j] ;") ; } } } Bonus! all ...= operators implemented at once!

Nevermind, read your message too quickly... I thought it was about the matrix class...
Apr 08 2012
prev sibling next sibling parent "Eyyub" <eyyub.pangearaion gmail.com> writes:
On Sunday, 8 April 2012 at 23:44:12 UTC, Francois Chabot wrote:
 On Sunday, 8 April 2012 at 23:41:51 UTC, Francois Chabot wrote:
 On Sunday, 8 April 2012 at 23:14:33 UTC, Eyyub wrote:
 Hello,

 How can I rewrite the exemple 2 
 (http://pastebin.com/q50903Zh) in D lang. ?
 This source code doesn't work...why ?
 http://paste.pocoo.org/show/wy1kDIpqTi2ApRuOxRRb/

 Thx. :)

As far as I know, there is nothing special about themplate classes with regards to operator overloading, so you can follow the examples in there: http://dlang.org/operatoroverloading.html which in your example would yield: Matrix opOpAssign(string op)( Matrix rhs ) { for( size_t i =0 ; i < M ; ++i ) { for( size_t j =0 ; j < N ; ++j ) { mixin("array_[i*N+j]" ~ op ~ " rhs.array_[i*N+j] ;") ; } } } Bonus! all ...= operators implemented at once!

Nevermind, read your message too quickly... I thought it was about the matrix class...

Np :D, you don't know how can I do for the example 2 ?
Apr 08 2012
prev sibling next sibling parent Andrej Mitrovic <andrej.mitrovich gmail.com> writes:
On 4/9/12, Eyyub <eyyub.pangearaion gmail.com> wrote:
 Np :D, you don't know how can I do for the example 2 ?

Well for one thing, there are no global operators in D. Others might help out with writing a proper opBinary that's defined in Value itself.
Apr 08 2012
prev sibling next sibling parent "Eyyub" <eyyub.pangearaion gmail.com> writes:
On Monday, 9 April 2012 at 00:04:50 UTC, Andrej Mitrovic wrote:
 On 4/9/12, Eyyub <eyyub.pangearaion gmail.com> wrote:
 Np :D, you don't know how can I do for the example 2 ?

Well for one thing, there are no global operators in D. Others might help out with writing a proper opBinary that's defined in Value itself.

Like this : http://paste.pocoo.org/show/VupvqFTLqZxvZajw71MA/ ? I have the same errors :s Thanks
Apr 08 2012
prev sibling next sibling parent James Miller <james aatch.net> writes:
* Eyyub <eyyub.pangearaion gmail.com> [2012-04-09 01:14:32 +0200]:

 Hello,
 
 How can I rewrite the exemple 2 (http://pastebin.com/q50903Zh) in D
 lang. ?
 This source code doesn't work...why ?
 http://paste.pocoo.org/show/wy1kDIpqTi2ApRuOxRRb/
 
 Thx. :)
 

What you want is something like this: class Value(int M, int K, int S) { private { float _value; } public { this(float val) { _value = val; } auto opBinary(string op : "/", int MO, int KO, int SO)(Value(MO, KO, SO) other) { return new Value!(M-MO, K-KO, S-SO)(_value/other.value); } } } A Few notes: 1. This isn't tested, might not work, but thats where you should aim... 2. Operator overloading is implemented as a lowering (as far as I'm aware) the compiler emits a template instantiation of opBinary("/") for the type. That means that you can add on more template arguments. 3. Using `auto` means that the compiler works out the type, so you don't have to add extra template arguments to calculate the correct type. Hope that helps. -- James Miller
Apr 09 2012
prev sibling parent "Eyyub" <eyyub.pangearaion gmail.com> writes:
On Monday, 9 April 2012 at 09:09:05 UTC, James Miller wrote:
 * Eyyub <eyyub.pangearaion gmail.com> [2012-04-09 01:14:32 
 +0200]:

 Hello,
 
 How can I rewrite the exemple 2 (http://pastebin.com/q50903Zh) 
 in D
 lang. ?
 This source code doesn't work...why ?
 http://paste.pocoo.org/show/wy1kDIpqTi2ApRuOxRRb/
 
 Thx. :)
 

What you want is something like this: class Value(int M, int K, int S) { private { float _value; } public { this(float val) { _value = val; } auto opBinary(string op : "/", int MO, int KO, int SO)(Value(MO, KO, SO) other) { return new Value!(M-MO, K-KO, S-SO)(_value/other.value); } } } A Few notes: 1. This isn't tested, might not work, but thats where you should aim... 2. Operator overloading is implemented as a lowering (as far as I'm aware) the compiler emits a template instantiation of opBinary("/") for the type. That means that you can add on more template arguments. 3. Using `auto` means that the compiler works out the type, so you don't have to add extra template arguments to calculate the correct type. Hope that helps. -- James Miller

Ho, yeah it works !!! :D :D http://paste.pocoo.org/show/ye7VXQHfLxsVM38bKyS6/ Thanks a lot !
Apr 09 2012