该错误是由于使用手动递归导致的越界访问造成的。函数式编程的部分目的是提供结构来消除此类错误的可能性。
这里有一些例子,但建议看一下概念手册hana::Foldable http://boostorg.github.io/hana/group__group-Foldable.html因为它确实是使用 Boost.Hana 的基础。
hana::fold_left http://boostorg.github.io/hana/group__group-Foldable.html#ga38c6b3f6b1cbadb9b8432a05ff16b7d2为您隐藏递归,并可以通过快速跟踪减少递归调用量:
constexpr decltype(auto) foo = [](auto ct, auto ... type) {
constexpr auto tuple = hana::make_tuple(type...);
return hana::fold_left(hana::make_range(hana::size_c<0>, hana::size_c<3>), 0L,
[tuple, ct](auto returnValue, auto i)
{
// returnValue param is not constexpr
if (hana::contains(tuple, ct[i])) {
return returnValue | (1 << decltype(i)::value);
}
else
{
return returnValue;
}
}
);
};
hana::fold_left 示例 https://wandbox.org/permlink/u0H0uDAp3WQLb4ZY
hana::unpack http://boostorg.github.io/hana/group__group-Foldable.html#ga7b0c23944364ce61136e10b978ae2170使用可变参数包扩展完全消除递归:
constexpr decltype(auto) foo = [](auto ct, auto ... type) {
constexpr auto tuple = hana::make_tuple(type...);
auto f = [tuple, ct](auto i)
{
return hana::contains(tuple, ct[i]) ? (1 << decltype(i)::value) : 0;
};
return hana::unpack(hana::make_range(hana::size_c<0>, hana::size_c<3>),
[f](auto ...i) { return (f(i) | ...); }
);
};
hana::解压示例 https://wandbox.org/permlink/ecfybhMJSpYFngUq