5

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

这是对的吗?“标签调度”不是使用 SFINAE 吗?如果它是正确的,那么 SFINAE 和标签调度之间究竟有什么区别?

4

1 回答 1

11

标签调度利用重载决议来选择正确的重载。

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

于 2019-10-30T17:14:41.787 回答