On 05/03/2017 07:26 PM, Nothing wrote:
Equality checking is where I stuck. It should work as follows:
0. If we compare the Box [b]b[/b] to an object [b]o[/b] that is not an
instance of Box, it should return false.
1. Empty boxes are equal no matter the type.
2. If type of payload for two boxes they're not equal.
3. If both boxes hold values of same types their payload is compared and
it is the final result.


Box!string() == Box!bool() -> true
Box!int(1) == Box!Int(1) -> true
Box!int(1) == Box!Int(2) -> false

So is there an idiomatic approach to know if the Object is an instance
of Box (regardless of content type T) and than if necessary to know
exactly if two boxes have same concrete type T?

No. You can check if a type is an instance of the Box template, but that doesn't help you here because you're dealing with `Object`. From there you can only get back to Box!Foo when you know Foo.

You can add a common non-templated interface for all different Box types.

----
interface BoxI
{
    bool isEmpty();
}
class Box(T) : BoxI
{
    /* ... */
}
----

Now you can cast to BoxI, and call isEmpty. Which is all you need to do your steps 0 and 1. For steps 2 and 3, you cast to the Box type at hand, i.e. `Box!T` or just `Box`.

Reply via email to