On Sunday, 29 October 2017 at 20:15:41 UTC, Ola Fosheim Grøstad wrote:
On Sunday, 29 October 2017 at 20:05:08 UTC, Steven Schveighoffer wrote:
It's actually perfect for generic code. If you need something other than the current "0 means false" behavior (like for instance int), then you wrap in a type that opCast!bool means what you want.

I think we just have to agree that we disagree. Generic programming relies on consistent protocols.

So, you generally don't want 0 to be considered as an invalid value. Because of the defaults in D, cast(bool) isn't really all that useful.

It would have been better if the default was to deny casting to bool, but that is too late as D has decided to be too close to C on so many levels, so it would be a bad idea to diverge from C for that now. So the next best thing is to let the programmer specify that something is invalid with some other means than opCast to bool.

*shrug*

But casting to bool is what you use to tell whether something is valid or not.

true = valid, false = invalid.

If you want 0 to be valid for a type then you wrap around it with opCast.

Ex.

---
import std.stdio;

struct MyInt
{
        int value;
        
        bool opCast(T : bool)()
        {
                return value >= 0;
        }
}

void main()
{
        MyInt a = MyInt(1);
        MyInt b = MyInt(0);
        MyInt c = MyInt(-1);
        
        if (a) writeln("a is valid");
        if (b) writeln("b is valid");
        if (c) writeln("c is valid");
}
---

Output:
a is valid
b is valid

Reply via email to