SFINAE 和标签分发之间的区别

Difference between SFINAE and tag dispatch

在本视频中,https://youtu.be/Vkck4EU2lOU?t=582 "tag dispatch" 和 SFINAE 作为备选方案,可以实现选择所需的模板功能。

是否正确? "tag dispatch" 不是在用 SFINAE 吗? 如果正确的话,SFINAE和tag dispatch到底有什么区别?

标签分派利用重载决议 select 正确的重载。

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 通常可以简化事情。