增强HANA编译时列表转换



我正在尝试弄清楚如何使用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>{};
}

在...

constexpr auto Pow2(int i) { return 1 << i; } 

... i是A 运行时整数。它不是" compile-fime-frimelly" 参数,因为它的值不是作为其类型的一部分存储的。您应该通过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示例


显然,您也可以使用lambda进行此操作。此外,boost::hana::int_operator<<超载返回int_

hana::transform(vals, [](auto x){ return hana::int_c<1> << x; });

wandbox示例

最新更新