gpt4 book ai didi

c++ - 如果每个参数都可转换为特定类型,则启用构造函数

转载 作者:搜寻专家 更新时间:2023-10-30 23:52:52 24 4
gpt4 key购买 nike

只要有多个参数并且每个参数都可转换为类型 value_type,我想启用类 foo 的构造函数。我尝试了以下方法:

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)
{
}
};

假设 foo::value_type = float。我试图声明 foo bar{ 1 }; 并观察到 ​​ctor 被禁用。为了查看发生了什么,我从模板中删除了 std::conjunction_v 部分并添加了

static_assert(std::conjunction_v<std::is_convertible_v<Ts, value_type>...>, "");

body 。现在我的编译器 (MSVC 14.1/Clang) 产生错误

template argument for template type parameter must be a type

static_assert(std::conjunction_v<std::is_convertible_v<Ts, value_type>...>, "");               
// ^

这里到底是什么问题?c

最佳答案

正如声明的那样,模板类型参数的模板参数必须是一个类型。在 std::conjunction<T...> , T s 应该是类型,但是 std::is_convertible_v<X, Y>直接产生值(value)。

试试这个:

std::conjunction_v<std::is_convertible<Ts, value_type>...>
// ^ no `_v`.

顺便说一句,因为你的目标是 C++17,你可以使用 fold expression而不是 std::conjunction :

template<class... Ts,
std::enable_if_t<((sizeof...(Ts) > 0) && ... && std::is_convertible_v<Ts, value_type>), int> _ = 0
>

关于c++ - 如果每个参数都可转换为特定类型,则启用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43324057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com