C ++: Расширить элементы массива как параметр функции, используя boost :: hana

Я обнаружил два месяца назад boost :: hana. Кажется, очень мощный, поэтому я решил посмотреть.
Из документации я видел следующие примеры:

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

это эквивалентно:

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

Я хотел бы знать, возможно ли (и если да, то как) написать что-то вроде:

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

своего рода «распаковка» во время компиляции или даже:

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

3

Решение

Ваш вопрос кажется двояким. Во-первых, заголовок вашего вопроса спрашивает, возможно ли расширить элементы массива в качестве параметров функции. Это действительно возможно, так как std::array является Foldable. Достаточно использовать 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) + ","; });
7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]