SFINAE和标签调度之间的差异

Difference between SFINAE and tag dispatch

本文关键字:之间 调度 标签 SFINAE      更新时间:2023-10-16

在此视频中https://youtu.be/Vkck4EU2lOU?t=582"标签调度"和SFINAE作为替代方案,可以实现所需模板功能的选择。

这是正确的吗?"标签调度"不是使用SFINAE吗?如果它是正确的,那么SFINAE和标签调度之间到底有什么区别?

标记调度利用过载解决方案来选择正确的过载。

auto f_impl(std::true_type) { return true; }
auto f_impl(std::false_type) { return std::string("No"); }
template <class T>
auto f(const T& t) {
return f_impl(std::is_integral<T>());
}

SFINAE通过使候选者由于替换失败而不合格来禁用候选者
替换失败正是它在锡上所说的:试图用具体的参数替换模板参数,却遇到了一个错误,在直接的上下文中只会拒绝该候选参数。

template <class T>
auto f(const T& t)
-> std::enable_if_t<std::is_integral_v<T>, bool> {
return true;
}
template <class T>
auto f(const T& t)
-> std::enable_if_t<!std::is_integral_v<T>, std::string> {
return std::string("No");
}

有时,一种或另一种技术更容易应用。自然地,它们可以结合在一起产生巨大的效果。

互补技术是部分专业化和完全专业化。此外,if constexpr通常可以简化事情。