c++ - 调用专门未模板化的函数

标签 c++ templates template-meta-programming

我有一堆函数可以检查各种形状之间的碰撞。

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++ 标记或功能允许您关闭或禁止对指定的行或 block 进行参数类型推断?目的是强制编译器查找非模板化实现,如果不存在则无法编译。

最佳答案

在函数声明期间(在打开 { 之前)没有查找函数模板的一次。利用这一点,我们可以将 SFINAE 未实现的参数排除在外:

template<typename Shape1, typename Shape2>
auto Collides(Shape1 a, Shape2 b) -> decltype(::Collides(b, a)) {
    return Collides(b, a);
}

但请注意,这必须写在 Collides 的所有其他声明之后。 .

您也可以只调用一个不同的委托(delegate)函数:

template<typename Shape1, typename Shape2>
auto ActualCollides(Shape1 a, Shape2 b) -> decltype(Collides(a, b)) {
    return Collides(a, b);
}

template<typename Shape1, typename Shape2>
auto ActualCollides(Shape1 a, Shape2 b) -> decltype(Collides(b, a)) {
    return Collides(b, a);
}

// Or rename `Collides` into `CollidesImpl` and you can call this `Collides` instead

这将考虑到 future Collides由于 ADL 的功能。

关于c++ - 调用专门未模板化的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61485764/

相关文章:

c++ - 如何创建没有特定定义的随机分布? Uniform_int_distribution是否从其他类继承?

javascript - 如何与来自 Cheerp/js 的外部变量交互?

c++ - H264 编码 - 无法使用 VLC Player 播放视频

c++ - 检测传递给函数模板函数参数的特定函数

c++ - 在基于模板的类中重载赋值运算符

c++ - 我应该自己删除 boost::ptr_vector 的指针吗?

templates - 无法使用 Hugo 链接到静态文件

c++ - 根据模板 C++ 的类型具有可变类型的类成员

c++ - 获取对模板参数给定类型对象的虚拟引用

c++ - 扩展函数模板的参数包