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

问题描述 投票:0回答:1

在本主题中,我们将学习如何将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模板。但由于Scalar参数没有出现在参数列表中,我发现很难在任何地方使用enable_if。由于参数包,我不能在参数列表和模板参数列表中添加伪参数。最后一个地方是返回类型,但正如我所说,我希望将其保持为自动。有任何想法吗?

c++ templates variadic-templates template-specialization sfinae
1个回答
0
投票

(老问题,但是对于那些发现这个问题的人来说回答。)

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

© www.soinside.com 2019 - 2024. All rights reserved.