在此视频中https://youtu.be/Vkck4EU2lOU?t=582 “标签调度”和 SFINAE 作为替代方案,允许实现所需模板功能的选择。
这是对的吗?“标签调度”不是使用 SFINAE 吗?如果它是正确的,那么 SFINAE 和标签调度之间究竟有什么区别?
在此视频中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
通常可以简化事情。