由于对允许的非类型可变参数模板有限制,我试图编写一个使用任意数量的双精度函数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++ 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...>的||?
你能用短路评估(两种情况下)吗?
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()>仅实例化一次调用||时,它也会调用两者foo和bar.