binary expression...

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat May 21 16:06:10 PDT 2016


On 05/21/2016 12:56 PM, captain_fid wrote:
 > On Saturday, 21 May 2016 at 18:33:53 UTC, Anonymouse wrote:
 >> On Saturday, 21 May 2016 at 18:10:55 UTC, captain_fid wrote:
 >>> Please forgive if asked before. My google skills seemed to fail me
 >>> and didn't see any result from search.
 >>>
 >>> My problem is simple (though not my understanding LOL).
 >>>
 >>> struct D {
 >>>       int value;
 >>>       bool opEquals()(bool value) const { return (value == value); }
 >>> }
 >>>
 >>> D aD;
 >>> if (aD == 1) { // OK
 >>> }
 >>>
 >>> if (aD) {      //  Error: expression aD of type D does not have a
 >>> boolean value
 >>> }
 >>>
 >>> Is there a way to overload for this? What am I missing?
 >>
 >> struct D
 >> {
 >>     int value;
 >>
 >>     bool opEquals(T)(T value) const {
 >>         return value == this.value;
 >>     }
 >>
 >>     bool opCast(T : bool)() const {
 >>         return this != this.init;  // or some such
 >>     }
 >> }
 >>
 >> Not tested, written on my phone so might have missed something.
 >
 > Perfect.. and your 'phoned-in' coding is impressive.
 >
 > opCast is the biggest thing I was missing/forgetting/misunderstanding 
here.

opCast is for explicit type conversions. However, you seem to want 
implicit type conversions.

 > I Still need to look back at what is happening with vit's solution.

vit's 'alias ... this' solution is it. Here is some for info:

   http://ddili.org/ders/d.en/alias_this.html

And here is another example if you want the 'bool' value to be 
calculated as opposed to being a member:

struct S {
     int x;
     int y;

     /* Implicit type conversion to 'bool'
      * (Because myBoolValue() returns 'bool'.) */
     alias myBoolValue this;

     bool myBoolValue() {
         return (x + y) == 7;    // Some special condition
     }
}

void main() {
     auto a = S(1, 2);
     auto b = S(3, 4);

     assert(!a);    // Calls a.myBoolValue()
     assert( b);    // Calls b.myBoolValue()
}

Ali



More information about the Digitalmars-d-learn mailing list