2017-02-23 88 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。 –