J'ai un un ensemble de surcharges d'une commutative fonction binaire nommée overlap
, qui accepte deux types distincts:
class A a; class B b;
bool overlap(A, B);
bool overlap(B, A);
Ma fonction overlap
retourne true si et seulement si une forme chevauche l'autre - c'est un exemple courant utilisé lors de la discussion multimethods.
Parce qu' overlap(a, b)
est équivalent à overlap(b, a)
, j'ai seulement besoin de mettre en œuvre un "côté" de la relation. Un répétitives solution est d'écrire quelque chose comme ceci:
bool overlap(A a, B b) { /* check for overlap */ }
bool overlap(B b, A a) { return overlap(a, b); }
Mais je préfère ne pas écrire un extra - N! / 2
trivial versions de la même fonction en leur permettant d'être généré à la place, à l'aide d'un modèle.
template <typename T, typename U>
bool overlap(T&& t, U&& u)
{ return overlap(std::forward<U>(u), std::forward<T>(t)); }
Unfortuately, c'est enclin à répéter à l'infini, ce qui n'est pas acceptable: voir http://coliru.stacked-crooked.com/a/20851835593bd557
Comment puis-je empêcher que de tels récursion infinie? Suis-je en approchant le problème correctement?