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

Reply via email to