I have a a set of overloads of a commutative binary function named overlap
, which accepts two distinct types:
class A a; class B b;
bool overlap(A, B);
bool overlap(B, A);
My function overlap
returns true if and only if one shape overlaps the other - this is one common example used when discussing multimethods.
Because overlap(a, b)
is equivalent to overlap(b, a)
, I only need to implement one "side" of the relation. One repetitive solution is to write something like this:
bool overlap(A a, B b) { /* check for overlap */ }
bool overlap(B b, A a) { return overlap(a, b); }
But I would prefer not to write an extra N! / 2
trivial versions of the same function by allowing them to be generated instead, using a template.
template <typename T, typename U>
bool overlap(T&& t, U&& u)
{ return overlap(std::forward<U>(u), std::forward<T>(t)); }
Unfortuately, this is prone to recurse infinitely, which is not acceptable: see http://coliru.stacked-crooked.com/a/20851835593bd557
How can I prevent such infinite recursion? Am I approaching the problem correctly?