2

在过去的美好时光里,我们曾经将 a 适配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吗?

4

1 回答 1

2

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

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

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

虽然 Boost.Hana 没有“随机访问序列”的迭代器,但它确实具有Boost.Hana概念at中的功能。不幸的是,Boost.Hana没有实现这些,尽管我相信它可以。也许可以添加。at_cIterableStruct

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

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

#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);
}
于 2018-01-23T18:30:14.760 回答