Boost Hana 编译时列表转换
Boost Hana Compile-Time List Transformation
我正在尝试弄清楚如何使用 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>
的资源生成一个类型。我没有看到如何将 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>{};
}
在...
constexpr auto Pow2(int i) { return 1 << i; }
...i
是一个 运行时整数 。它不是 "compile-time-friendly" 参数,因为它的值不作为其类型的一部分存储。您应该传入 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>>
>);
显然,您也可以使用 lambda 执行此操作。此外,boost::hana::int_
有一个 operator<<
重载 returns 一个 int_
:
hana::transform(vals, [](auto x){ return hana::int_c<1> << x; });
我正在尝试弄清楚如何使用 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>
的资源生成一个类型。我没有看到如何将 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>{};
}
在...
constexpr auto Pow2(int i) { return 1 << i; }
...i
是一个 运行时整数 。它不是 "compile-time-friendly" 参数,因为它的值不作为其类型的一部分存储。您应该传入 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>>
>);
显然,您也可以使用 lambda 执行此操作。此外,boost::hana::int_
有一个 operator<<
重载 returns 一个 int_
:
hana::transform(vals, [](auto x){ return hana::int_c<1> << x; });