On Jan 11, 11 17:10, Justin Johansson wrote:
On 10/01/11 05:42, Andrei Alexandrescu wrote:
I wrote a simple helper, in spirit with some recent discussions:

// either
struct Either(Ts...)
{
Tuple!Ts data_;
bool opEquals(E)(E e)
{
foreach (i, T; Ts)
{
if (data_[i] == e) return true;
}
return false;
}
}

auto either(Ts...)(Ts args)
{
return Either!Ts(tuple(args));
}

unittest
{
assert(1 == either(1, 2, 3));
assert(4 != either(1, 2, 3));
assert("abac" != either("aasd", "s"));
assert("abac" == either("aasd", "abac", "s"));
}

Turns out this is very useful in a variety of algorithms. I just don't
know where in std this helper belongs! Any ideas?

Despite that it may be very useful as you say, personally I think it is
a fundamental no-no to overload the meaning of "==" in any manner that
does not preserve the generally accepted semantics of equality which
include the notions of reflexivity, symmetry and transitivity**.

**See http://en.wikipedia.org/wiki/Equality_%28mathematics%29

The symmetric and transitive properties of the equality relation imply
that if (a == c) is true and if (b == c) is true then (a == b) is also
true.

In this case the semantics of the overloaded "==" operator have the
expressions 1 == either(1, 2, 3) and 2 == either(1, 2, 3) both
evaluating to true and by implication/expectation (1 == 2).

Clearly though, (1 == 2) evaluates to false in terms of the commonly
accepted meaning of equality.

Just my 2 cents and I wonder if there some other way of achieving the
desired functionality of your helper without resorting to overloading
"==" and the consequential violation of the commonly held semantics of
equality.

Cheers,
Justin Johansson

We could use in instead of ==

if (1 in oneOf(1, 2, 3)) { ... }
if (4 !in oneOf(1, 2, 3)) { ... }

Reply via email to