【问题标题】:SFINAE together with auto-deduced return type and variadic templatesSFINAE 连同自动推导的返回类型和可变参数模板
【发布时间】:2017-04-01 21:13:44
【问题描述】:

在本主题中,我们学习如何将 SFINAE 与自动/自推返回类型一起使用: How do I use std::enable_if with a self-deducing return type?

但是,当我还使用可变参数模板时,我似乎无法应用任何技术。这是我的签名:

template<typename Scalar, class ClassDispatcher, typename... Args>
auto dispatch(Args&&... args) {}

我想专门研究使用 SFINAE 的标量模板。但是由于 Scalar 参数没有出现在参数列表中,我发现很难在任何地方使用 enable_if。而且由于参数包,我无法将虚拟参数添加到参数列表或模板参数列表中。最后一个地方是返回类型,但如前所述,我想将其保留为自动。有什么想法吗?

【问题讨论】:

  • 将此函数转发给一个辅助函数,该函数接受一个虚拟的 Scalar 指针(你总是可以传递 nullptr),然后专门化那个。
  • “我无法将虚拟参数添加到...模板参数列表”这不是真的。
  • @T.C.那么请出示这个。如果我这样做:template&lt;typename Scalar, class ClassDispatcher, typename std::enable_if&lt;std::is_same&lt;Scalar, float&gt;::value&gt;::type, typename... Args&gt; 我收到关于无法推断“__formal”类型的错误
  • 和@IgorTandetnik 这行得通,谢谢!不是最漂亮的解决方案,但我很高兴它没有改变界面——我只是把它塞进一个详细的命名空间中。

标签: c++ templates variadic-templates template-specialization sfinae


【解决方案1】:

(老问题,但为找到此问题的人回答。)

在模板形参列表的末尾添加一个带有基于std::enable_if的默认实参的类型模板形参,并通过使用依赖于Args的逗号表达式使默认实参依赖于推导的Args,即使你不关心Args,然后在Scalar上添加任何你想要的测试:

#include <type_traits>

template<typename Scalar, class ClassDispatcher, typename... Args,
         typename = typename std::enable_if<(sizeof...(Args), std::is_same<Scalar, float>::value)>::type>
auto dispatch(Args&&... args) {}

关键是要使 SFINAE 工作,默认模板参数必须依赖 推导模板参数,即使只是在结果不受影响的逗号表达式中由实际推导出的模板参数。

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多