【问题标题】:Difference between SFINAE and tag dispatchSFINAE 和标签调度的区别
【发布时间】:2019-10-30 16:48:39
【问题描述】:

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

正确吗? “标签调度”不是使用 SFINAE 吗? 如果正确,SFINAE和tag dispatch到底有什么区别?

【问题讨论】:

  • 你能在你的问题中包含一些相关的上下文吗?不是每个人都可以观看视频

标签: c++ templates sfinae tag-dispatching


【解决方案1】:

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

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

【讨论】:

  • 替换失败的定义是什么?
  • @user2449761 给定一个函数调用,编译器获取用户传递给它的参数类型,并尝试将它们与范围内“最合适”的函数声明匹配(替换)(我不知道)无需提及所有候选函数具有相同的名称)。因此,当声明的函数与调用不匹配时,我们会遇到替换失败,编译器会继续搜索更好的匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 2020-09-28
  • 2021-10-01
  • 2014-01-31
  • 2021-08-27
  • 2013-08-20
  • 1970-01-01
相关资源
最近更新 更多