Обрабатывать частичный тип с помощью Boost Hana
То, что я называю частичным типом, выглядит примерно так:
template < template <typename ...> typename Skeleton,
template <typename ...> typename WrapperType,
typename ... Pölicies >
struct MetaStorage {
template < typename ... Ts >
struct With_Type {
using type = Skeleton<WrapperType<Ts...>, Policies...>;
};
};
using partialType = MetaStorage<Sk, Wt, P1, P2, P3>;
using finalType = partialType::With_Type<T1, T2>;
Я не думаю, что это хорошо согласуется с философией хана, и это не читается, если я хочу разделить шрифт больше, чем это.
Так каков эффективный способ сделать это с Boost Hana?
Редактировать:
Под этим я подразумеваю способ разрешить пользователю создавать конечный тип за несколько шагов. Например, они могут использовать некоторый частичный тип для генерации каждого окончательного типа. Но с обычным синтаксисом и hana::type
,
1 ответ
С Boost.Hana вы можете поднять типы до значений с hana::type
и то же самое с использованием шаблонов hana::template_
, С этим вы можете сделать следующее:
#include <boost/hana.hpp>
namespace hana = boost::hana;
template <typename ...X> struct skeleton_t { };
constexpr auto skeleton = hana::template_<skeleton_t>;
template <typename ...X> struct wrapper_t { };
constexpr auto wrapper = hana::template_<wrapper_t>;
template <int i> struct policy_t { };
template <int i> constexpr auto policy = hana::type_c<policy_t<i>>;
template <int i> struct foo_t { };
template <int i> constexpr auto foo = hana::type_c<foo_t<i>>;
int main() {
auto meta_storage = [](auto s, auto w, auto ...policies) {
return [=](auto ...ts) {
return s(w(ts...), policies...);
};
};
auto partial = meta_storage(skeleton, wrapper, policy<1>, policy<2>);
auto final_ = partial(foo<1>, foo<2>);
skeleton_t<wrapper_t<foo_t<1>, foo_t<2>>, policy_t<1>, policy_t<2>> check
= typename decltype(final_)::type{};
}
Лично я предпочитаю не беспокоиться с hana::template_
в тех случаях, когда я могу просто использовать функцию. Я также использую макрос для создания типа тега вместе с соответствующим hana::type
значение, чтобы уменьшить некоторые настройки, которые вы видите выше основной функции.