2

介绍的真实世界示例能否在不退回到原始递归的情况下构建?

当然,我们可能会以一种复杂的方式将 Hana 算法交织在一起来实现这一点,……</p>

为什么要如此复杂?- 我想像这个例子一样生成代码经常发生。

我对该项目和谷歌进行了一些研究,但找不到任何替代实现。

我自己实验过:

template <typename Any>
auto switch_(Any& a) {
  return [&a](auto ...cases_) {
    auto cases = hana::make_tuple(cases_...);
    auto default_ = hana::find_if(cases, [](auto const& c) {
      return hana::first(c) == hana::type_c<default_t>;
    });
    static_assert(default_ != hana::nothing, "switch is missing a default_ case");
    auto rest = hana::filter(cases, [](auto const& c) {
      return hana::first(c) != hana::type_c<default_t>;
    });
    auto& type_idx = a.type();
    auto found = hana::find_if(rest, [&](auto const& c) {
      using T = int; // typename decltype(+hana::first(c))::type;
      return hana::bool_c<typeid(int) == type_idx>;
      // return hana::bool_c<false>;
    });
    if constexpr (found == hana::nothing) {
        return hana::second(*default_)();
    }
    else {
        using T = typename decltype(+hana::first(*found))::type;
        return hana::second(*found)(*boost::unsafe_any_cast<T>(&a));
    }
  };
}

find_if无法在编译时解析,因为只有type_idx在运行时才知道。

将军hana::fold_left应该能够做到这一点。但我不知道如何传输所有细节并自动推断返回类型。

我将不胜感激。

4

0 回答 0