Boost Hana 编译时列表转换
Posted
技术标签:
【中文标题】Boost Hana 编译时列表转换【英文标题】:Boost Hana Compile-Time List Transformation 【发布时间】:2017-02-23 15:47:14 【问题描述】:我试图弄清楚如何在编译时使用 boost:hana 转换整数常量列表。
我的清单如下:
constexpr auto vals = hana::to<hana::tuple_tag>(hana::range_c<int, 0, 3>);
我要应用功能:
constexpr auto Pow2(int i) return 1 << i;
然而
constexpr auto res = hana::transform(list, Pow2);
为 hana::tuple<int, int, int>
的 res 生成一个类型。我没有看到如何将 lambda 的参数移动到 hana::int_c
的模板参数中
// Compiler error: Non-type template argument is not a constant expression
constexpr auto Pow2(int i)
return hana::int_c<1 << i>;
【问题讨论】:
【参考方案1】:在...
constexpr auto Pow2(int i) return 1 << i;
...i
是一个运行时整数。它不是 “编译时友好” 参数,因为它的值不作为其类型的一部分存储。您应该改为传递int_
:
template <int X>
constexpr auto Pow2(hana::int_<X>) return hana::int_c<1 << X>;
用法:
constexpr auto vals = hana::to<hana::tuple_tag>(hana::range_c<int, 0, 3>);
constexpr auto res = hana::transform(vals, [](auto x) return Pow2(x); );
static_assert(std::is_same_v<
std::decay_t<decltype(res)>,
hana::tuple<hana::int_<1>, hana::int_<2>, hana::int_<4>>
>);
wandbox example
显然,您也可以使用 lambda 来执行此操作。此外,boost::hana::int_
有一个 operator<<
重载,它返回一个 int_
:
hana::transform(vals, [](auto x) return hana::int_c<1> << x; );
wandbox example
【讨论】:
谢谢。我想知道这是否是一种好方法,只是我的编译器不支持规范技术。将您的示例切换为 clang 3.9.1prog.cc:12:20: error: constexpr variable 'res' must be initialized by a constant expression constexpr auto res = hana::transform(vals, [](auto x) return hana::int_c<1> << x; );
有没有办法让它与 clang 3.9.1 一起使用?
@user78145:是的,只要去掉constexpr res
中的constexpr
这不起作用的原因是因为 lambda 在 C++14 中不能是 constexpr,这是在 C++17 中解除的一个愚蠢的限制。以上是关于Boost Hana 编译时列表转换的主要内容,如果未能解决你的问题,请参考以下文章
如何将 boost::hana::tuple 转换为 std::variant
将 boost 用于 TR1 时,boost math 特殊函数编译错误