C ++:使用boost :: hana

时间:2016-01-10 22:44:20

标签: c++ boost c++14 boost-hana

两个月前我发现了boost :: hana。看起来非常强大所以我决定看一看。 从文档中我看到了这个例子:

std::string s;
hana::int_c<10>.times([&]{ s += "x"; });

相当于:

s += "x"; s += "x"; ... s += "x"; // 10 times

我想知道是否有可能(如果是的话)写smthg:

std::string s;
std::array<int, 10> xs = {1, 3, 5, ...};
hana::int_c<10>.times([&](int i){ s += std::to_string(xs[i]) + ","; });

某种&#34;拆包&#34;在编译时,甚至:

myfunction( hana::unpack<...>( xs ) );

1 个答案:

答案 0 :(得分:7)

你的问题似乎有两个方面。首先,您的问题的标题询问是否可以将数组的元素扩展为函数的参数。确实有可能,因为std::arrayFoldable。使用hana::unpack

就足够了
#include <boost/hana/ext/std/array.hpp>
#include <boost/hana/unpack.hpp>
#include <array>
namespace hana = boost::hana;


struct myfunction {
    template <typename ...T>
    void operator()(T ...i) const {
        // whatever
    }
};

int main() {
    std::array<int, 10> xs = {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}};
    hana::unpack(xs, myfunction{});
}

其次,你问是否有可能做类似

的事情
std::string s;
std::array<int, 10> xs = {1, 3, 5, ...};
hana::int_c<10>.times([&](int i){ s += std::to_string(xs[i]) + ","; });

答案是使用hana::int_c<10>.times.with_index

hana::int_c<10>.times.with_index([&](int i) { s += std::to_string(xs[i]) + ","; });    

同样,您也可以使用hana::for_each

hana::for_each(xs, [&](int x) { s += std::to_string(x) + ","; });