首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以对使用Boost Hana的方法进行反思?

是否可以对使用Boost Hana的方法进行反思?
EN

Stack Overflow用户
提问于 2015-09-20 11:06:16
回答 1查看 1.6K关注 0票数 8

升压式Hana提供了以简单而漂亮的方式对类成员字段进行反思的能力:

代码语言:javascript
复制
// define:

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

// below could be done inline, but I prefer not polluting the 
// declaration of the struct
BOOST_HANA_ADAPT_STRUCT(not_my_namespace::Person, name, age);

// then:

Person john{"John", 30};
hana::for_each(john, [](auto pair) {
  std::cout << hana::to<char const*>(hana::first(pair)) << ": "
            << hana::second(pair) << std::endl;
});

但是,文档只提到成员字段。我也想反思一下方法。我尝试用一种方法天真地扩展这个示例:

代码语言:javascript
复制
struct Foo {
    std::string get_name() const { return "louis"; }
};

BOOST_HANA_ADAPT_STRUCT(::Foo, get_name);

这是编译出来的。但是,一旦我尝试使用类似于上面(for_each.)的代码,我就会得到许多编译错误。由于没有任何例子显示方法的内省,所以我想知道它是否被支持。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-22 06:57:34

我最初的回答是废话,对不起。这里有一个重写,它实际上回答了这个问题。

我只是添加了一个宏,以便轻松定义带有自定义访问器的Struct。以下是你如何做到的:

代码语言:javascript
复制
#include <boost/hana/adapt_adt.hpp>
#include <boost/hana/at_key.hpp>
#include <boost/hana/string.hpp>
#include <cassert>
#include <string>
namespace hana = boost::hana;

struct Person {
    Person(std::string const& name, int age) : name_(name), age_(age) { }
    std::string const& get_name() const { return name_; }
    int get_age() const { return age_; }
private:
    std::string name_;
    int age_;
};

BOOST_HANA_ADAPT_ADT(Person,
    (name, [](auto const& p) { return p.get_name(); }),
    (age, [](auto const& p) { return p.get_age(); })
);

int main() {
    Person bob{"Bob", 30};
    assert(hana::at_key(bob, BOOST_HANA_STRING("name")) == "Bob");
    assert(hana::at_key(bob, BOOST_HANA_STRING("age")) == 30);
}

这段代码应该可以在master上运行。否则,如果您需要对访问器的定义或映射到它们的键进行更多的控制,您还可以手动定义整个过程:

代码语言:javascript
复制
namespace boost { namespace hana {
    template <>
    struct accessors_impl<Person> {
        static auto apply() {
            return hana::make_tuple(
                hana::make_pair(BOOST_HANA_STRING("name"), [](auto&& p) -> std::string const& {
                    return p.get_name();
                }),
                hana::make_pair(BOOST_HANA_STRING("age"), [](auto&& p) {
                    return p.get_age();
                })
            );
        }
    };
}}

您可以找到关于如何在参考文献中为Struct概念定义Structs的更多信息。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32678647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档