查找 is_constructible 所持有的类型

2023-12-01

我正在使用模板并尝试实现以下助手。

first_constructible<Types..., Args...>::type

这将返回第一种类型Types这是可以构造的Args...。第一个问题显然是有两个参数包struct,所以我将用法更改为

first_constructible<std::tuple<Types...>, Args...>::type

我通过将元组类型拆分为第一个和其余来实现它,并使用进行检查std::is_constructible并在必要时递归。

template<typename T>
struct pop_front_tuple
{
    template<typename U, typename... Us>
    static std::tuple<Us...> impl(std::tuple<U, Us...>);

    using type = decltype(impl(std::declval<T>())); // std::tuple with removed first type
};

template<typename Tuple, typename... Args>
struct first_constructible
{
    using first_type = decltype(std::get<0>(std::declval<Tuple>()));

    using type = typename std::conditional
    <
        std::is_constructible<first_type, Args...>::value,
        first_type,
        typename first_constructible<typename pop_front_tuple<Tuple>::type, Args...>::type
    >::type;
};

// end of recursion
template<typename... Args>
struct first_constructible<std::tuple<>, Args...>
{
    using type = void;
};

但由于某种原因它不起作用。 IE

first_constructible<std::tuple<std::string, int>, std::string>::type a = ""; // works, a is std::string
first_constructible<std::tuple<std::string, int>>::type a = ""; // fails, error: variable or field 'a' declared void
first_constructible<std::tuple<std::string, int>, std::string::size_type, std::string::value_type> // fails, same error

我不知道我的错误在哪里。std::is_constructible<std::string>::value and std::is_constructible<std::string, std::string::size_type, std::string::value_type>::value是真的。

科利鲁链接


首先,一些元编程玩具:

template<class Tag>
using type_t = typename Tag::type;
template<class T> struct tag_t{using type=T; constexpr tag_t(){}};
template<class T> constexpr tag_t<T> tag{};

template<class...Tuples>
using cat_tuples = decltype(std::tuple_cat( std::declval<Tuples>()... ));

template<template<class...>class Z, class Tuple, class=void>
struct filter;
template<template<class...>class Z, class Tuple>
using filter_t = type_t<filter<Z,Tuple>>;

template<template<class...>class Z>
struct filter<Z, std::tuple<>,void>:tag_t<std::tuple<>>{};
template<template<class...>class Z, class T0, class...Ts>
struct filter<Z, std::tuple<T0, Ts...>, std::enable_if_t<Z<T0>::value>>:
    tag_t<
        cat_tuples<
            std::tuple<T0>,
            filter_t<Z, std::tuple<Ts...>>
        >
    >
{};
template<template<class...>class Z, class T0, class...Ts>
struct filter<Z, std::tuple<T0, Ts...>, std::enable_if_t<!Z<T0>::value>>:
    filter<Z, std::tuple<Ts...>>
{};

现在我们解决您的问题:

template<class...Args>
struct is_constructible_test {
    template<class T>
    using result=std::is_constructible<T,Args...>;
};

template<class Tuple, class...Args>
using all_constructible_t = filter_t<is_constructible_test<Args...>::template result, Tuple>;

template<class Tuple, class...Args>
using first_constructible = std::tuple_element_t<0, all_constructible_t<Tuple,Args...>>;

测试代码:

struct bob {
    bob( int, int, int ) {}
};
template<std::size_t>
struct alice {
    alice(int) {}
};

int main() {
    using is_alice = first_constructible<std::tuple<std::string, bob, alice<1>, alice<2>, int>, int>;
    static_assert( std::is_same<is_alice, alice<1>>::value, "works" );
}

活生生的例子.

C++14,但仅用于_t别名。代替std::foo_t<blah> with typename std::foo<blah>::type.

我所做的是找到every可构造类型,然后抓住第一个。过滤器是我一直以来的一个简单概念,它比编写“首先通过测试”更容易,因为过滤器后跟“首先无条件”在逻辑上是相同的(如果更昂贵的话)。

你可以修改filter当测试通过时,上面的“短路”并返回而不是与 tail 连接:

template<template<class...>class Z, class Tuple, class=void>
struct search;
template<template<class...>class Z, class Tuple>
using search_t = type_t<search<Z,Tuple>>;

template<template<class...>class Z>
struct search<Z, std::tuple<>,void>{};
template<template<class...>class Z, class T0, class...Ts>
struct search<Z, std::tuple<T0, Ts...>, std::enable_if_t<Z<T0>::value>>:
    tag_t<T0>
{};
template<template<class...>class Z, class T0, class...Ts>
struct search<Z, std::tuple<T0, Ts...>, std::enable_if_t<!Z<T0>::value>>:
    search<Z, std::tuple<Ts...>>
{};

并替换first_constructible模板包含:

template<class Tuple, class...Args>
using first_constructible = search_t<is_constructible_test<Args...>::template result, Tuple>;

实例2.

我可能可以像您一样使用实用函数来与元组交互而不是专门化,并且会有优势。


我看到你的一个问题是get<>返回一个引用,而不是一个值。std::tuple_element_t可能是一个更好的计划。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找 is_constructible 所持有的类型 的相关文章

  • 将 new 与 decltype 一起使用

    T t T is an implementation detail t new T want to avoid naming T to allow for flexibility t new decltype t error cannot
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 删除是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 C 编程 free 如何知道要释放多少 https stackoverflow com questions 1518711 c programming how does free know how m
  • 在现代 C++ 中,临时生命周期延长何时有用?

    在 C 中 您可以将函数的返回值 返回值 而不是引用 绑定到 const 引用 并且代码仍然有效 因为该临时对象的生命周期将延长到作用域末尾 例如 std string get string return abc void f const
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 在开关中使用“goto”?

    我看到了一个建议的编码标准 内容如下Never use goto unless in a switch statement fall through 我不跟 这个 例外 案例到底是什么样的 这证明了goto 此构造在 C 中是非法的 swi
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 增强精神、递归和堆栈溢出

    为什么下面的代码在运行时崩溃 它会给出堆栈溢出错误 include
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 使用 jQuery 从 ASP.Net JSON 服务获取数据

    我正在尝试调用 Google 地图地理编码 API 从纬度 经度对中获取格式化的地址 然后将其记录到控制台 我正在尝试获取为给定位置返回的第一个 formatted address 项目 我很简单无法从 JSON 中提取该项目 我不知道为什
  • 如何调试 .NET 运行时中的内部错误?

    我正在尝试调试一些处理大文件的工作 代码本身works 但 NET 运行时本身会报告零星错误 对于上下文 这里的处理是一个 1 5GB 文件 仅加载到内存中一次 在循环中处理和释放 故意尝试重现此否则不可预测的错误 我的测试片段基本上是 t
  • 如何在 winforms 应用程序的主屏幕显示之前显示欢迎屏幕?

    我想在应用程序启动时加载欢迎屏幕 然后用户单击欢迎屏幕上的按钮 然后关闭欢迎屏幕 最后显示主屏幕 static void Main startup method being called Application EnableVisualSt
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • 文本区域中的回车作为换行检索

    如何在文本区域中保留回车符 textarea value X String fromCharCode 13 X textarea value charCodeAt 1 returns 10 not 13 看这里 http jsfiddle
  • 使用PythonAnywhere作为游戏服务器

    我正在构建一款回合制游戏 希望实现客户端 服务器风格的网络 我真的只需要发送几个对象的位置和一些其他易于编码的数据 尽管我已经在套接字和扭曲中编写了一些基本的东西 但我对网络还很陌生 不过现在 我需要能够将数据发送到不在我的本地网络上的计算
  • 如何使用 LibGDX 制作文本按钮?

    我已经按照 youtube 上的一些教程为我的 libgdx 游戏制作按钮 但遇到了无法加载 Button pack 的问题 stage new Stage black new BitmapFont Gdx files internal f
  • React router - 将 api 数据传递给链接的组件以打开新页面

    我很难理解在这里设计路由 例如 array map each gt
  • Hibernate二级缓存示例

    我正在开发hibernate ehcache程序 Entity Table name pizza public class Pizza implements Serializable Id GeneratedValue private In
  • 使用 Razor MVC3 中的 ViewModel 在单个视图中显示多个模型(视图中仅包含详细信息)

    我的任务是显示多个models到一个视图中 我创建了一个ViewModel满足我的要求 但我没有达到我的要求 请查看下面的代码并纠正我哪里出错了 public partial class StudentsDetail public int
  • 数据绑定到计算字段

    我遇到了一个小问题 我试图将 DataGrid 的 DataTextColumn 绑定到计算字段 WPF
  • 如何比较 Java 中的原始时间和现在? [复制]

    这个问题在这里已经有答案了 可能的重复 如何比较 Java 中的原始时间 例如假设我有 String endTime 16 30 45 我如何确定现在是否在这个时间之前 我努力了 SimpleDateFormat sdf new Simpl
  • 查询 MongoDB 集合中所有不同字段的列表

    我有一个存储所有表单数据的集合 每个表单具有不同的结构 但某些表单具有重叠的字段名称 我喜欢 mongo 因为它在这里证明了它的易用性 使我能够根据一些小的共同因素对完全不同的数据进行排序和聚合 现在 对于 UI 我需要数据库中所有可能字段
  • 外部化 Grails 数据源配置

    Grails 1 x 允许通过设置使用外部配置文件grails config locations指示 是否有类似的方法可用于外部化 Datasource groovy 中的数据库配置 无需设置 JNDI 事实证明 能够在应用程序外部的简单配
  • 如何使用 JavaScript 获取本地文件夹内容

    我正在尝试使用 JavaScript 获取本地文件夹内容 我尝试过 Filesystem API 但收到如下错误 DOMException 已确定某些文件在 Web 应用程序中访问不安全 或者对文件资源进行了太多调用 如何获取本地文件夹中的
  • Firebase 以及 Google-Auth 和 Phone-Auth 的 SHA-1 问题

    我目前正在制作一个应用程序 您也可以通过 Google 帐户或手机号码登录 Firebase 随着keytool我已经读取了我的 SHA 1 并将其存储在 Firebase 的项目设置中 我还在 Android Studio 中通过 Gra
  • 用于获取插入值的 Cassandra 示例触发代码

    我需要您帮助提取触发器增强方法中的列名称和值 表定义 create table dy data id timeuuid data key text time timestamp data text primary key id data k
  • 从 C# 中的 PL/SQL 匿名块返回游标

    我正在努力将现有应用程序从 SQL Server 转换为 Oracle 但遇到了障碍 我正在尝试将匿名块作为动态 SQL 执行并返回结果集 然而 我尝试过的任何方法似乎都无法返回任何值 由于设计限制 存储过程已被淘汰 我的查询定义为 DEC
  • 如何重定向到 FastAPI 端点内的动态 URL?

    我正在做一项功能 用户可以在其个人资料页面上进行更改 与用户模型无关 一切都是通过静态来实现的HTML模板 我需要用户在处理请求后单击按钮并返回同一页面 即他们的个人资料页面 网页模板 td a href class btn blue li
  • 非静态非引用数据成员声明是变量吗?

    我想根据以下答案和附加讨论重新提出问题 为什么非静态数据成员引用不是变量 类的非静态数据成员本身不会创建新变量 它只是帮助您定义类的属性 如果它确实创建了一个新变量 您就可以编写如下代码 class Chamber public int p
  • iOS 加密 AES128/CBC/nopadding 为什么不起作用?

    我有一个应用程序需要使用 AES CBC 无填充对一些数据进行编码 该应用程序也移植到了安卓系统上 编码是这样完成的 byte encodedKey getKey SecretKeySpec skeySpec new SecretKeySp
  • IronPython + Emacs?

    我决定进入 IronPython 因为我几乎只在 NET 中工作 但需要一些比 C 稍微简单一点的东西来模拟快速的东西 Python 非常适合处理小事情 一次性测试之类的事情 但现在我需要能够访问我们的一些 NET 代码 尽管我完全反感 但
  • 如何输出键以数字开头的 JSON 值?

    获取这个 json 响应 self http macpro local 2990 jira rest api 2 issue CSS 4 votes votes 2 hasVoted true voters self http macpro
  • 查找 is_constructible 所持有的类型

    我正在使用模板并尝试实现以下助手 first constructible