如何将同类型的fusion::vector转换为(std/boost)::array?

4

我对boost相对较新,所以我认为这是一个简单的问题:
假设有一个fusion::vector<int, int, int>,我需要一个好的方法将其转换为array<int, 3>

2个回答

4
您可以直接使用array<>(std或boost)的内置适配和copy

在Coliru上实时查看

#include <boost/fusion/include/copy.hpp>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/adapted/boost_array.hpp>
#include <boost/array.hpp>

using namespace boost;

int main() {
    fusion::vector<int, int, int> fv(1,2,3);
    array<int, 3> arr;

    fusion::copy(fv, arr);
}

1
在@sehe的答案基础上,您还可以使用fusion::invoke来摆脱未初始化的数组。
#include <boost/fusion/functional/invocation/invoke.hpp>

#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/adapted/boost_array.hpp>
#include <boost/array.hpp>

using namespace boost;

#include <iostream>
int main() {
    fusion::vector<int, int, int> fv(1,2,3);

    auto arr = fusion::invoke([](int x, int y, int z){return array<int, 3>{x, y, z};}, fv);

    for(auto i : arr)
        std::cout << i << " ";
}

在C++14中变得更加吸引人

    auto arr = fusion::invoke([](auto... xs){return array<int, 3>{xs...};}, fv);

而且在C++17中

    auto arr = fusion::invoke([](auto... xs){return std::array{xs...};}, fv);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接