boost - Boost.Hana 中的 BOOST_FUSION_ADAPT_ASSOC 相当于什么?

标签 boost c++14 boost-fusion boost-hana adaptor

在过去的好日子里,我们曾经将struct改编成Boost.Fusion容器或关联容器

#include <boost/fusion/adapted/struct/adapt_struct.hpp>
#include <boost/fusion/adapted/struct/adapt_assoc_struct.hpp>

struct Person{
    std::string name;
    int age;
};

BOOST_FUSION_ADAPT_STRUCT(
    Person,
    (std::string, name)
    (int, age)
);

struct tag_name;
struct tag_age;

BOOST_FUSION_ADAPT_ASSOC_STRUCT(
    Person,
    (std::string, name, tag_name)
    (int, age, tag_age));

int main(){}

现在有了 Boost.Hana,我们也可以适应

#include <boost/hana/adapt_struct.hpp>
BOOST_HANA_ADAPT_STRUCT(Person, 
    name,
    age
);

问题:Boost.Hana 中是否存在某种 BOOST_HANA_ADAPT_ASSOC_STRUCT(相当于 BOOST_FUSION_ADAPT_ASSOC_STRUCT)?或者现在的做法有所不同?

额外问题:有 BOOST_HANA_ADAPT_TPL 吗?

最佳答案

根据 Boost.Fusion 的文档,BOOST_FUSION_ADAPT_ASSOC_STRUCT 宏生成用于建模的样板 随机访问序列和关联序列。

使用 Boost.Hana,不需要这些额外的宏,因为您无需任何样板即可免费获得附加功能。

对于“关联序列”,Boost.Hana 有 Searchable提供 at_key 的概念功能。

虽然 Boost.Hana 没有“随机访问序列”的迭代器,但它确实具有函数 atat_c在 Boost.Hana 的 Iterable概念。 不幸的是Boost.Hana的Struct没有实现这些,尽管我相信它可以。也许可以添加这一点。

对于BOOST_HANA_ADAPT_TPL,Boost.Hana没有用于简化模板结构的宏,但用户仍然可以实现hana::accessors制作 Struct没有任何宏。

您可以使用编译时字符串按名称搜索 boost::hana::Struct 成员:

#define BOOST_HANA_CONFIG_ENABLE_STRING_UDL
#include <boost/hana.hpp>
#include <string>

namespace hana = boost::hana;
using namespace hana::literals;

struct Person {
  std::string name;
  int age;
};

BOOST_HANA_ADAPT_STRUCT(
  Person,
  name,
  age
);

int main()
{
  Person person{"Joe", 42};

  // hana::Searchable search by key
  hana::at_key(person, "name"_s);
  hana::at_key(person, "age"_s);
}

关于boost - Boost.Hana 中的 BOOST_FUSION_ADAPT_ASSOC 相当于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48394801/

相关文章:

c++ - 返回常量的 boost 绑定(bind)或 lambda 仿函数

c++ - 如果未指定返回类型,递归 lambda 将无法编译

c++ - 返回类型的转发引用

c++ - 基础接口(interface)的 shared_ptr 的初始化和管理

c++ - boost mpl序列模式匹配

c++ - 使用 Boost 的 Linux 的 Visual Studio 2017 远程构建

c++ - Fusion 有尾部功能吗?

c++ - BOOST_FUSION_ADAPT_STRUCT 没有采用正确数量的参数

c++ - 迭代 Boost fusion::vector

c++ - tellp 与文件锁定一起使用是否安全