当前位置: 首页 > 知识库问答 >
问题:

SFINAE以及自动推断的返回类型和可变模板

颛孙航
2023-03-14

在本主题中,我们将学习如何将SFINAE与自动/自推断返回类型结合使用:如何将std::enable_if与自推断返回类型结合使用?

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

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

我想专门研究使用SFINAE的标量模板。但是由于标量参数没有出现在参数列表中,我发现在任何地方都很难使用enable_。由于参数包,我不能向参数列表或模板参数列表添加伪参数。最后一个地方是返回类型,但如前所述,我想保持它为自动。有什么想法吗?

共有1个答案

班安平
2023-03-14

(老问题,但为那些找到这个的人回答。)

在模板参数列表末尾添加带有基于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工作,默认模板参数必须依赖于推导的模板参数,即使仅在其结果不受实际推导的模板参数影响的逗号表达式中。

 类似资料:
  • 对于将SFINAE与可变模板类一起使用,我似乎找不到一个好的解决方案。 假设我有一个不喜欢引用的可变参数模板对象: 以及一个类,可以方便地检查参数包是否包含引用: 我如何使用它来专门化NoRef的情况下,引用存在于arg包?

  • 问题内容: Java通常可以基于参数(甚至与返回类型(例如,与C#相反))来推断泛型。 恰当的例子:我有一个通用类,它只存储一对值,并且可以按以下方式使用: 该方法如下所示: 非常好。但是,这不再适用于以下需要通配符的用例: (请注意显式强制转换以进行正确的类型。) 代码失败,并显示以下错误(由Eclipse提供): 类型不匹配:无法从转换为 但是,显式调用构造函数仍然可以按预期工作: 有人可以解

  • 我的函数使用一组给定的输入参数(变量)调用Python函数,并返回包含函数输出的元组(变量,因为输出随调用的函数而变化)。 我正在使用C 11通过MinGW-w64编译器的g端口在视窗10机器上编译。我声明了这个模板变量函数(并调用它)如下: 但是,会引发此错误(为了可读性,缩短为):

  • 问题内容: 以下代码在t3行中出现编译错误: 错误消息是: 类型不匹配:无法从对象转换为T 我知道我可以使用强制转换或手动绑定来解决问题,我的问题是: 编译器进行自动绑定是否如此困难,是否会失败? 编辑:添加了错误消息。 编辑:添加了另一个示例如何不会发生该错误。 编辑:删除了第二个示例,因为它令人困惑,使问题更加清楚。 问题答案: 在第一种情况下,您有两个具有名为的类型参数的泛型方法,但是这些类

  • 考虑代码: 我用不同的编译器(通过编译器资源管理器)测试了代码。 如果Clang 7.0.0编译,而给出错误: :8:20:错误:没有与函数模板专用化“栏”匹配的函数模板 :7:26:注意:已忽略候选模板:无法将'void()'与'int()'匹配 Visual C同意(MSVC 19 2017 RTW): (8) :错误C2912:显式专门化“int Test::bar(void)”不是函数模板

  • C++是静态语言:所有变量的类型,都会在编译时被准确指定。所以,作为程序员你需要为每个变量指定对应的类型。 有些时候就需要使用一些繁琐类型定义,比如: std::map<std::string,std::unique_ptr<some_data>> m; std::map<std::string,std::unique_ptr<some_data>>::iterator iter=m.