了解Boost.Hana快速入门

如何解决了解Boost.Hana快速入门

我正在研究Boost.Hana's User Manual,以了解有关C ++中的模板元编程和函数式编程的更多信息。

关于Real world example,我仍然想念一些,全部集中在以下函数的定义上:

template<typename Any,typename Default,typename Case,typename ...Rest>
auto process(Any a,std::type_index const& t,Default default_,Case& case_,Rest ...rest) {
    using T = typename decltype(+hana::first(case_))::type;
    return typeid(T) == t ? hana::second(case_)(*boost::unsafe_any_cast<T>(&a))
                          : process(a,t,default_,rest...);
};

这是我的疑问和疑问:

  • 关于using指令,我确实知道T是要存储在first的{​​{1}}条目中的类型,即用case_获得的一对,但是为什么这么复杂呢?我对所有这些hana::make_pair::typedecltypetypename感到困惑。它们如何彼此交互(在这种情况下,如果这个问题看起来很笼统)?

    • 嗯,需要的hana::type_c确实让我感到困惑。有什么用?
  • 一旦我认为+是我需要的那种类型,为什么我要按T进行比较?

    • std::type_index中,我读到 typeid(T) == t类是围绕type_index对象的包装类
    • std::type_info中我读到,std::type_info包含有关类型的特定于实现的信息,包括类型的名称和用于比较两种类型是否相等的方法。 strong>或整理顺序
    • 并且从typeid中我读了(参考用法type_info)是指表示类型类型的typeid(type)对象

    这似乎都是相关的,但是我不知道如何将std::type_info类的typeid(T)std::type_info进行比较,后者是通过调用{{1 }} std::type_index上的成员函数,我不知道它来自哪里。我希望有人能帮助我理解这一点。

  • type为true的return语句中,为什么需要atypeid(T) == t不起作用?

解决方法

我将尝试回答有关using这一行的问题:

  • case_hana::pair创建的hana::make_pair(hana::type_c<T>,f)类型的变量(第一个参数是类型的包装器)
  • hana::first(case_)返回该对中的第一项(围绕该类型的hana :: type_c包装器)
  • +hana::first(case_)使用一元加号将值从左值转换为右值(请参见https://www.boost.org/doc/libs/1_68_0/libs/hana/doc/html/structboost_1_1hana_1_1type.html
  • decltype(+hana::first(case_))评估为该对中第一项的类型(hana :: type_c包装器)
  • decltype(+hana::first(case_))::type返回该对中第一项的实际类型(无论是在hana :: type_c内部构造的那种类型)
  • using T = typename decltype(+hana::first(case_))::type;将原始类型命名为T(需要使用typename位,因为C ++是一种复杂的语言,有时编译器需要提示事物是否为类型)

您需要一些机制来提取传递给hana :: make_pair的原始类型-如果您要构建一些东西来仅解决您的特定问题,则会使其变得更简单,但是它们需要使库如此通用,以至于解决每个人的问题,这增加了复杂性。

第二return行:

该示例的整个前提是switch_被传递了boost :: any,并使用boost :: any的内容调用了正确的lambda。

hana::second(case_)是最初提供给switch_的lambda之一,因此,如果您使用hana::second(case_)(a),则boost :: any会传递给您的lambda,但lambda内部的代码却不会期望boost :: any,所以错误消息显示std :: to_string不接受boost :: any。

您实际上可以使用hana::second(case_)(a),然后将boost :: any参数转换回lambda内部的原始类型。那实际上可以很好地工作,但是我认为switch_应该为您做些事情,以便lambda获得您期望的类型。

不幸的是,boost :: any需要如此糟糕的转换语法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-