boost.hana学习笔记之map

news/2025/2/16 5:23:52/

        Hana是C++元编程的头文件库,适用于类型和值的计算。 它提供的功能是成熟的Boost.MPL和Boost.Fusion库提供的功能的超集。 通过利用C++11/14实现技术和习惯用法,Hana拥有比以前的元编程库更快的编译时间和运行时性能,同时显着提高了过程中的表达能力。 Hana很容易以特别的方式进行扩展,它提供了与Boost.Fusion、Boost.MPL和标准库的开箱即用的互操作。

        hana::map是基本的关联容器,需要唯一的,可比较的和哈希的键。

        map元素的顺序未指定。 此外,所有键都必须是Hashable的,并且任何两个具有相等哈希值的键在编译时都必须是Comparable的。

注意

hana::map的实际表示是一个实现细节。 因此,除了明确记录为映射接口的一部分之外,不应假设任何其它内容,例如:

  • 存在额外构造函数
  • 存在额外赋值运算符
  • hana::map<Pairs...>是或不是依赖类型的事实

特别是,最后一点非常重要;hana::map<Pairs...>基本上等同于decltype(hana::make_pair(std::declval<Pairs>()...))
例如,在模板参数推导期间,这不是可以进行模式匹配的东西。 更多细节在教程中。

下面是本人写的一个示例:

#include <string>
#include <iostream>
#include <boost/hana/map.hpp>
#include <boost/hana/pair.hpp>
#include <boost/hana/string.hpp>
#include <boost/hana/at_key.hpp>
#include <boost/hana/insert.hpp>
#include <boost/hana/for_each.hpp>namespace hana = boost::hana;constexpr auto g_obj = hana::make_map(hana::make_pair(BOOST_HANA_STRING("name"), "zhangsan"),hana::make_pair(BOOST_HANA_STRING("age"), 20)
);int main()
{constexpr auto g_obj2 = hana::insert(g_obj, hana::make_pair(BOOST_HANA_STRING("score"), 80.5));hana::for_each(hana::keys(g_obj2), [](auto x) {std::string key = hana::to<char const*>(x);auto value = hana::at_key(g_obj2, x);std::cout << "key type: " << typeid(x).name() << std::endl;std::cout << "key name: " << key << std::endl;std::cout << "value type: " << typeid(value).name() << std::endl;std::cout << "value: " << value << std::endl;std::cout << "----------------------------------------------------" << std::endl;});return 0;
}

开发环境:Windows11,VS2022 17.8.3,C++20
运行结果:

key type: struct boost::hana::string<110,97,109,101>
key name: name
value type: char const * __ptr64
value: zhangsan
----------------------------------------------------
key type: struct boost::hana::string<97,103,101>
key name: age
value type: int
value: 20
----------------------------------------------------
key type: struct boost::hana::string<115,99,111,114,101>
key name: score
value type: double
value: 80.5
----------------------------------------------------


http://www.ppmy.cn/news/1301311.html

相关文章

127. 单词接龙

和433.最小基因变化这道题一样的解法。 https://blog.csdn.net/qq_43606119/article/details/135538247 class Solution {public int ladderLength(String beginWord, String endWord, List<String> wordList) {Set<String> cnt new HashSet<>();for (int …

适合PC端的7款最佳时间规划、项目管理软件

分享PC端7类主流的时间管理规划软件&#xff1a;PingCode、Worktile、Todoist、Pomodoro Timer 、Toggl等。 一、时间管理软件的类型 时间管理软件可以根据其功能和应用场景被划分为几种不同的类型。每种类型的软件都旨在帮助用户以不同的方式更有效地管理和分配他们的时间。以…

挥手告别2023,2024找回初心

原本是想在2023年12月31号写完发表出来的&#xff0c;一直拖到现在。为什么呢&#xff1f;因为我在2023年最后一个月失业了&#xff0c;虽然我没表现出来很失落&#xff0c;反而感到轻松&#xff0c;但不代表我内心不纠结、不焦虑。因为公司业务缩减了&#xff0c;应该跟大环境…

【AI视野·今日Robot 机器人论文速览 第七十一期】Fri, 5 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Fri, 5 Jan 2024 Totally 11 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Machine Learning in Robotic Ultrasound Imaging: Challenges and Perspectives Authors Yuan Bi, Zhongliang Jiang, Felix D…

原生微信小程序如何动态修改svg图片颜色及尺寸、宽高(封装svgIcon组件)解决ios不显示问题

最终效果 前言 动态设置Svg图片颜色就是修改Svg源码的path中的fill属性&#xff0c; 通过wx.getFileSystemManager().readFile读取.xlsx文件 ios不显示需要把encoding设置 binary 把文件转成base64 封装svg-icon组件 1、在项目的components下新建svg-icon文件夹&#xff0c;新…

记一次 Redis 数据库迁移

笔者通过一个 Redis 数据库迁移的例子&#xff0c;介绍了迁移脚本的执行思路。 作者&#xff1a;马文斌&#xff0c;MySQL/Redis 爱好者~ 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 本文约 500 字&#xff0c;预计阅…

数据库和表的操作

文章目录 前言一、库的操作创建数据库字符集和校验规则操纵数据库查看数据库显示创建语句修改数据库删除数据库备份和恢复数据库还原查看连接情况 二、表的操作创建表查看表结构修改表修改表名添加一列修改某一列属性删除某一列 删除表 前言 一、库的操作 创建数据库 语法&am…

随机漫步【scatter的使用】

去掉scatter的坐标轴&#xff08;未成功版&#xff09; import matplotlib.pyplot as plt from random import choice class RandomWalk():def __init__(self,num_points 5000):self.num_points num_pointsself.x_values [0]self.y_values [0]def fill_walk(self):while l…