Можно ли исследовать методы, использующие Boost Hana?

Boost Hana предоставляет возможность простого и красивого анализа полей членов класса:

// 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;
});

Однако в документации упоминается только член поля. Я хотел бы также изучить методы. Я попытался наивно расширить пример с помощью метода:

struct Foo {
std::string get_name() const { return "louis"; }
};

BOOST_HANA_ADAPT_STRUCT(::Foo, get_name);

Это компилируется. Тем не менее, как только я пытаюсь использовать его, используя код, аналогичный приведенному выше (for_each…), я получаю много ошибок компиляции. Поскольку нет примеров, показывающих самоанализ методов, мне интересно, поддерживается ли он.

8

Решение

Мой оригинальный ответ был дерьмом; простите за это. Вот переписать, что на самом деле отвечает на вопрос.

Я просто добавил макрос, чтобы легко определить Struct с пользовательскими аксессуарами. Вот как вы можете это сделать:

#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, В противном случае, если вам нужен больший контроль над определением ваших аксессоров или ключей, используемых для их сопоставления, вы также можете определить все это вручную:

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в ссылка для Struct концепция.

9

Другие решения


По вопросам рекламы [email protected]