C++ 如果每个参数都可转换为特定类型,则启用一个ctor
每当有多个参数且每个参数都可转换为类型C++ 如果每个参数都可转换为特定类型,则启用一个ctor,c++,c++17,typetraits,enable-if,C++,C++17,Typetraits,Enable If,每当有多个参数且每个参数都可转换为类型值\u类型时,我想启用类foo的一个ctor。我尝试了以下方法: struct foo { using value_type = /* some type */; template<class... Ts, std::enable_if_t<(sizeof...(Ts) > 0) && std::conjunction_v<std::is_convertible_v<Ts, va
值\u类型时,我想启用类foo
的一个ctor。我尝试了以下方法:
struct foo
{
using value_type = /* some type */;
template<class... Ts,
std::enable_if_t<(sizeof...(Ts) > 0) && std::conjunction_v<std::is_convertible_v<Ts, value_type>...>, int> = 0>
explicit foo(Ts&&... vs)
{
}
};
给身体。现在,我的编译器(MSVC14.1/Clang)产生了错误
模板类型参数的模板参数必须是类型
在
static_断言(std::conjunction_v,”);
// ^
这里到底是什么问题?c正如前面所述,模板类型参数的模板参数必须是一个类型。在std::conjunction
中,T
s按be类型假定,但std::is\u可转换\u v
直接生成值
请尝试以下方法:
std::conjunction_v<std::is_convertible<Ts, value_type>...>
// ^ no `_v`.
请注意,std::conjunction
提供短路。如果您在将其交给std::conjunction
之前已经实例化了所有内容,那么它无法做到这一点。c++17解决方案-在t=0时启用。
static_assert(std::conjunction_v<std::is_convertible_v<Ts, value_type>...>, "");
// ^
std::conjunction_v<std::is_convertible<Ts, value_type>...>
// ^ no `_v`.
template<class... Ts,
std::enable_if_t<((sizeof...(Ts) > 0) && ... && std::is_convertible_v<Ts, value_type>), int> _ = 0
>