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
通常可以简化事情。
在本视频中,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
通常可以简化事情。