У меня есть набор функций, которые проверяют наличие коллизий между различными типами фигур.
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 ++ или функция, позволяющая отключить или запретить вывод типа аргумента для указанной строки или блока? Цель состоит в том, чтобы заставить компилятор искать не шаблонную реализацию, а затем не скомпилировать, если она не существует.