【问题标题】:Handle partial type with Boost Hana使用 Boost Hana 处理部分类型
【发布时间】:2017-04-06 10:30:03
【问题描述】:

我在这里所说的部分类型是这样的:

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

【问题讨论】:

  • 我不确定您所说的“最有效的方法”是什么意思?在做什么?
  • @LouisDionne 我希望编辑更清楚。

标签: c++ metaprogramming boost-hana


【解决方案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 值,以减少您在主函数上方看到的一些设置。

【讨论】:

  • 一个 lambda,返回一个 lambda... 我应该尽可能多地做 Haskell。这实际上与结构相同,但具有值类型,很好!我只是等着看 Louis Dionne 是否有什么要补充的,我会关闭它。谢谢:)
  • 模板是类型的函数。使用 Hana,类型上的函数表示为函数(这里是通用 lambda),所以这将是正确的答案。我会说,像这样简单的事情是否真的值得采用 Hana 方式取决于您的实际用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
相关资源
最近更新 更多