使用enable_if检查参数包的类型

use*_*744 12 c++ templates 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 */ }
Run Code Online (Sandbox Code Playgroud)

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

T.C*_*.C. 18

bool_pack再招.

template<bool...> struct bool_pack;
template<bool... bs> 
using all_true = std::is_same<bool_pack<bs..., true>, bool_pack<true, bs...>>;
Run Code Online (Sandbox Code Playgroud)

然后

template<class R, class... Ts>
using are_all_convertible = all_true<std::is_convertible<Ts, R>::value...>;
Run Code Online (Sandbox Code Playgroud)

最后

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

  • @KerrekSB"任何都是真的"=不是"全是假的".所以只需沿类似的行定义`all_false`,然后使用any_true = std :: integral_constant <bool,!all_false <bs ...> :: value>;``template <bool ... bs> (4认同)

moi*_*rex 5

您可以在 c++17 中使用fold 表达式来做与此处发布的其他答案相同的事情,但无需创建模板。

#include <type_traits>

template <typename... T, typename = 
    typename std::enable_if<
        (true && ... && std::is_convertible_v<T, ___YOUR_TYPE___>),
        void
    >::type
>
constexpr auto foo(T...) noexcept {
        // your code 
}
Run Code Online (Sandbox Code Playgroud)