use*_*761 2 c++ templates sfinae tag-dispatching
在此视频中,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>());
}
Run Code Online (Sandbox Code Playgroud)
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");
}
Run Code Online (Sandbox Code Playgroud)
有时,一种或另一种技术更易于应用。当然,它们可以组合起来产生巨大的效果。
补充技术是部分和全部专业化。而且,if constexpr通常可以简化事情。