boost.hana学习笔记之map

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>()...))

例如,在模板参数推导期间,这不是可以进行模式匹配的东西。 更多细节在教程中。

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

cpp 复制代码
#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
----------------------------------------------------
相关推荐
C++ 老炮儿的技术栈13 小时前
GCC编译时无法向/tmp 目录写入临时汇编文件,因为设备空间不足,解决
linux·运维·开发语言·汇编·c++·git·qt
橘颂TA13 小时前
【笔试】算法的暴力美学——牛客 NC213140 :除2!
c++·算法·结构与算法
wsoz14 小时前
Leetcode普通数组-day5、6
c++·算法·leetcode·数组
favour_you___14 小时前
2026_4_8算法练习题
数据结构·c++·算法
SccTsAxR14 小时前
算法基石:手撕离散化、递归与分治
c++·经验分享·笔记·算法
Q741_14714 小时前
每日一题 力扣 3655. 区间乘法查询后的异或 II 模拟 分治 乘法差分法 快速幂 C++ 题解
c++·算法·leetcode·模拟·快速幂·分治·差分法
夏乌_Wx15 小时前
剑指offer | 2.4数据结构相关题目
数据结构·c++·算法·剑指offer·c/c++
米啦啦.15 小时前
C+类的友元与静态成员函数,类模板
c++·友元·类模板
超绝振刀怪15 小时前
【C++可变模板参数】
开发语言·c++·可变模板参数
minji...15 小时前
Linux 线程同步与互斥(二) 线程同步,条件变量,pthread_cond_init/wait/signal/broadcast
linux·运维·开发语言·jvm·数据结构·c++