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
>