Boost.Hana中BOOST_FUSION_ADAPT_ASSOC的等价物是什么?

时间:2018-01-23 05:28:24

标签: 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

1 个答案:

答案 0 :(得分:2)

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

使用Boost.Hana,不需要这些额外的宏,因为您可以免费获得额外的功能而无需任何锅炉板。

对于&#34;关联序列&#34;,Boost.Hana具有提供Searchable功能的at_key概念。

虽然Boost.Hana没有&#34;随机访问序列&#34;的迭代器,但在Boost.Hana {{3}中确实有atat_c的函数概念。 不幸的是,Boost.Hana的Iterable并没有实现这些,尽管我相信它可以。也许可以添加。

至于BOOST_HANA_ADAPT_TPL,Boost.Hana没有用于促进模板结构的宏,但是用户仍然可以实现Struct来制作hana::accessors而无需任何宏。

您可以使用编译时字符串按名称搜索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);
}