Re: binary expression...

2016-05-24 Thread captain_fid via Digitalmars-d-learn

On Saturday, 21 May 2016 at 23:06:10 UTC, Ali Çehreli wrote:

On 05/21/2016 12:56 PM, captain_fid wrote:
>>> [...]
fail me
>>>   [...]
value); }
>>> [...]
have a
>> [...]
something.
> [...]
missing/forgetting/misunderstanding here.

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


> [...]
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


Thanks Ali (and again for making your work so available - I'm 
almost always re-reading). For some reason, I've missed 'alias 
this' and it is fascinating.


I'm off to retry these suggestions now...



Re: binary expression...

2016-05-21 Thread Ali Çehreli via Digitalmars-d-learn

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



Re: binary expression...

2016-05-21 Thread captain_fid via Digitalmars-d-learn

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.


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


Sorry again for the bad example to both of you.




Re: binary expression...

2016-05-21 Thread captain_fid via Digitalmars-d-learn

On Saturday, 21 May 2016 at 18:31:46 UTC, vit 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;

alias value this;///"implicit cast"

bool opEquals()(bool value) const {
  return (this.value == value); ///'this.' is required
}
}


Thanks both vit and anonymouse. (And I couldn't even provide a 
good example -- didn't mean to use 'value' for opEquals() arg 
 argg


Regardless -- vit, your suggestion compiled (and I laughed) but 
I'm not sure what's getting called. The opEquals() overload 
doesn't seem to be it. Hard returns of true or false don't seem 
to impact code. Hmmm.


I'll also check anoymouse's suggestion.

Regardless, thanks for the assistance.


Re: binary expression...

2016-05-21 Thread Anonymouse via Digitalmars-d-learn

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.


Re: binary expression...

2016-05-21 Thread vit via Digitalmars-d-learn

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;

alias value this;///"implicit cast"

bool opEquals()(bool value) const {
  return (this.value == value); ///'this.' is required
}
}