【问题标题】:Boost Hana Compile-Time List TransformationBoost Hana 编译时列表转换
【发布时间】: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&lt;int, int, int&gt; 的 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>{};
}

【问题讨论】:

    标签: c++ boost metaprogramming boost-hana


    【解决方案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&lt;&lt; 重载,它返回一个 int_

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

    wandbox example

    【讨论】:

    • 谢谢。我想知道这是否是一种好方法,只是我的编译器不支持规范技术。将您的示例切换为 clang 3.9.1 prog.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&lt;1&gt; &lt;&lt; x; }); 有没有办法让它与 clang 3.9.1 一起使用?
    • @user78145:是的,只要去掉constexpr res中的constexpr
    • 这不起作用的原因是因为 lambda 在 C++14 中不能是 constexpr,这是在 C++17 中解除的一个愚蠢的限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多