微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 使用enable_if检查参数包的类型

由于 allowed non-type variadic templates一个限制,我试图用一个使用enable_if的方式编写一个任意数量的双精度函数.实质上,我想做一些像:
template<typename... T,typename = typename std::enable_if<std::is_convertible<T,double>::value,T>::type>
    foo(T... t){ /* code here */ }

我选择将enable_if作为未命名参数的认值,因为我的函数实际上是一个构造函数,不会有一个返回值.这将适用于单个参数,但由于它是一个可变模板T是参数包,上述代码无效.那么,我如何检查每个参数是否可以转换成双倍?

解决方法

bool_pack的技巧又一次.
template<bool...> struct bool_pack;
template<bool... bs> 
using all_true = std::is_same<bool_pack<bs...,true>,bool_pack<true,bs...>>;

然后

template<class R,class... Ts>
using are_all_convertible = all_true<std::is_convertible<Ts,R>::value...>;

最后

template<typename... T,typename = typename enable_if<are_all_convertible<double,T...>::value>::type>
foo(T... t){ /* code here */}

原文地址:https://www.jb51.cc/c/110339.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐