介绍的真实世界示例能否在不退回到原始递归的情况下构建?
当然,我们可能会以一种复杂的方式将 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
应该能够做到这一点。但我不知道如何传输所有细节并自动推断返回类型。
我将不胜感激。