2017-02-23 47 views
2

我想弄清楚如何在编译时使用boost: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>资源类型。我没有看到如何将参数移动到拉姆达为模板参数为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>{}; 
} 

回答

3

在...

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

+0

感谢。我想知道这是否是一种好方法,只是我的编译器不支持规范技术。将您的示例切换为叮当声3.9.1 'prog.cc:12:20:错误:constexpr变量'res'必须通过常量表达式初始化 constexpr auto res = hana :: transform(vals,[](auto x ){return hana :: int_c <1><< x;});' 有没有办法让它与clang 3.9.1一起工作? – wes

+0

@ user78145:是的,只是摆脱了'constexpr' in'constexpr res' –

+0

这个原因不起作用是因为lambda不能在C++ 14中实现,这是一个愚蠢的限制,在C + +17。 –