2

我试图弄清楚如何在编译时使用 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);

为 的 res 生成一个类型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>{};
}
4

1 回答 1

4

在 ...

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

...i是一个运行时整数。它不是“编译时友好”参数,因为它的值不作为其类型的一部分存储。你应该传入 aint_代替:

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<<返回一个重载int_

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

魔杖盒示例

于 2017-02-23T15:57:10.717 回答