Custom type creation guidelines
John Colvin via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu Jan 7 02:00:42 PST 2016
On Wednesday, 6 January 2016 at 18:38:50 UTC, rumbu wrote:
> Let's suppose that I want to implement a custom arithmetic
> type. Looking through phobos at Complex, BigInt, HalfFloat,
> Variant, etc, there is no consistent or idiomatic way to
> implement various operators or functions on custom types.
>
> 1) Regarding unary operator overloading, what's the best way to
> implement them?
>
> auto ref opUnary(string op)() if (op == "+") { ... }
> auto ref opUnary(string op : "+")() if (op == "+") { ... }
> auto ref opUnary(string op)() { static if (op == "+") { } else
> ... }
It depends, do you want to do it all in one function? It's up to
the author to decide. using `:` or `if` doesn't matter here.
> 2) Regarding binary operator overloading, question 1 apply
> also, but there is more: what's the best signature?
>
> ref T opBinary(string op, T)(auto const ref T rhs) { ... }
> inout(T) opBinary(string op, T)(inout(T) rhs) { ... }
> ref T opBinary(string op, T)(T rhs) { ... }
Whatever works for your particular types and expresses the
behaviour you want. I would suggest that returning by ref from
opBinary is weird, but maybe you want/need that. Maybe your
comparisons require modifying both objects, maybe they don't.
There's no straightforward answer here.
> 3) Regarding comparison operators:
> - is there a way to have the same result for != and == (similar
> to float nans)
That's not how it works:
assert ((float.nan != float.nan) == !(float.nan == float.nan));
> - is there a way to return the same result for <, <=, >=, >
> (similar to float nans)
Hmmm... not sure about that. nans are a pain.
> - is there a way to overload float comparison operators?
I thought those were deprecated?
> 4) regarding casting:
> - we have opCast(T) to convert my custom type to type T. Is
> there any method to overload the casting operation from a built
> in type, e.g. cast(MyType)(int)?
Don't think so. Perhaps we need an opCastFrom.
More information about the Digitalmars-d-learn
mailing list