相关疑难解决方法(0)

使用enable_if检查参数包的类型

由于对允许的非类型可变参数模板有限制,我试图编写一个使用任意数量的双精度函数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?

c++ templates variadic-templates

12
推荐指数
2
解决办法
2307
查看次数

C++ Variadic模板AND和OR

您可以使用C++ 11可变参数模板来完成/* ??? */:

template<bool...v> struct var_and { static bool constexpr value = /* ??? */; };
Run Code Online (Sandbox Code Playgroud)

所以在编译时var_and<v...>::value提供&&了布尔包v

你可以做同样struct var_or<v...>||

你能用短路评估(两种情况下)吗?

编辑:对已接受答案的更新添加了C++ 17 折叠表达式启用

template<bool... v> constexpr bool var_and = (v && ...);
template<bool... v> constexpr bool var_or  = (v || ...);
Run Code Online (Sandbox Code Playgroud)

看来,对于基于参数包的方法,只能进行受限类型的"短路评估":在var_or<true,foo(),bar()>仅实例化一次调用||时,它也会调用两者foobar.

c++ variadic-templates c++11

7
推荐指数
1
解决办法
1264
查看次数

标签 统计

c++ ×2

variadic-templates ×2

c++11 ×1

templates ×1