Определить структуру Hana с параметрами шаблона - PullRequest
0 голосов
/ 01 мая 2018

Есть ли способ определить (адаптировать) структуру для Hana с параметрами шаблона?

Канонический пример - это не шаблонный класс,

#include <boost/hana/define_struct.hpp>
#include <string>

namespace hana = boost::hana;

struct Person {
    BOOST_HANA_DEFINE_STRUCT(Person,
        (std::string, name),
        (int, age)
    );
};

Мы пытаемся добавить параметры шаблона, возникает ошибка компиляции:

template<class S = std::string, class I = int>
struct Person {
    BOOST_HANA_DEFINE_STRUCT(Person<S, I>,
        (S, name),
        (I, age)
    );
};

Я думал, что это не удалось из-за использования запятых, поэтому я попытался decltype(Person<S, I>) вместо Person<S,I>.

В Boost.Fusion у нас было BOOST_FUSION_DEFINE_TPL_STRUCT , но я не могу найти эквивалент в Хане.

Как определить структуру Hana с параметрами шаблона?

1 Ответ

0 голосов
/ 01 мая 2018

Я нашел решение здесь: https://boostorg.github.io/hana/group__group-Struct.html

template<class S, class I>
struct Person {
    S name;
    I age;

    struct hana_accessors_impl {
        static BOOST_HANA_CONSTEXPR_LAMBDA auto apply() {
            return boost::hana::make_tuple(
                boost::hana::make_pair(BOOST_HANA_STRING("name"),
                [](auto&& p) -> decltype(auto) {
                    return boost::hana::id(std::forward<decltype(p)>(p).name);
                }),
                boost::hana::make_pair(BOOST_HANA_STRING("age"),
                [](auto&& p) -> decltype(auto) {
                    return boost::hana::id(std::forward<decltype(p)>(p).age);
                })
            );
        }
    };
};

Что вызывает другой вопрос, зачем Хане вообще нужен первый параметр? так как это не нужно?

Кстати, это тоже сработало, с чего я не пытался начать Я не уверен, работает ли это вообще.

template<class S, class I>
struct Person {
    BOOST_HANA_DEFINE_STRUCT(Person,
        (std::string, name),
        (int, age)
    );
};
...