使用 Boost Hana 处理部分类型
Handle partial type with 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>;
我认为它不太符合hana哲学,如果我想将类型拆分得比这更不可读。
那么使用 Boost Hana 执行此操作的有效方法是什么?
编辑:
我的意思是,一种允许用户分几步创建最终类型的方法。就像他们可以使用一些部分类型来生成每个最终类型。但是使用通常的语法和 hana::type
.
使用 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
值,以减少您在主函数上方看到的一些设置。
我这里所说的部分类型是这样的:
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>;
我认为它不太符合hana哲学,如果我想将类型拆分得比这更不可读。
那么使用 Boost Hana 执行此操作的有效方法是什么?
编辑:
我的意思是,一种允许用户分几步创建最终类型的方法。就像他们可以使用一些部分类型来生成每个最终类型。但是使用通常的语法和 hana::type
.
使用 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
值,以减少您在主函数上方看到的一些设置。