我有一组名为的可交换二元函数的重载overlap
,它接受两种不同的类型:
class A a; class B b;
bool overlap(A, B);
bool overlap(B, A);
我的功能overlap
当且仅当一个形状与另一个形状重叠时返回 true - 这是讨论时使用的一个常见示例多种方法 https://en.wikipedia.org/wiki/Multiple_dispatch.
Because overlap(a, b)
相当于overlap(b, a)
,我只需要实现关系的一个“方面”。一种重复的解决方案是编写如下内容:
bool overlap(A a, B b) { /* check for overlap */ }
bool overlap(B b, A a) { return overlap(a, b); }
但我不想额外写一个N! / 2
通过允许使用模板生成相同函数的简单版本。
template <typename T, typename U>
bool overlap(T&& t, U&& u)
{ return overlap(std::forward<U>(u), std::forward<T>(t)); }
不幸的是,这很容易无限递归,这是不可接受的:请参阅http://coliru.stacked-crooked.com/a/20851835593bd557 http://coliru.stacked-crooked.com/a/20851835593bd557
如何防止这种无限递归?我是否正确地处理了这个问题?