【发布时间】:2020-04-28 17:01:55
【问题描述】:
我有一堆函数可以检查各种形状之间的碰撞。
bool Collides(Rect r, Circle c);
bool Collides(Rect r, Line l);
bool Collides(Line l, Circle c);
我希望我可以实现一个模板化函数,通过允许它交换输入参数,可以将我的实现计数减半。这样就不必再实施了:
// The same as before but the input parameters swapped
bool Collides(Circle c, Rect r) { return Collides(r, c); }
bool Collides(Line l, Rect r) { return Collides(r, l); }
bool Collides(Circle c, Line l) { return Collides(l, c); }
我可以改为写一次:
template <typename Shape1, typename Shape2>
bool Collides(Shape1 a, Shape2 b)
{
return Collides(b, a);
}
不幸的是,当 Collides(a, b) 和 Collides(b, a) 都未实现时,它会在运行时递归调用模板化函数,这显然是意外行为。
是否有一些 C++ 标记或功能允许您关闭或禁止指定行或块的参数类型推导?目的是强制编译器查找非模板化实现,如果不存在则编译失败。
【问题讨论】:
-
@royseph 当存在同名且参数类型合适的非模板函数时,甚至不选择模板函数。
标签: c++ templates template-meta-programming