如何将同质的fusion::向量转换为(std/boost)::数组

How to convert a homogeneous fusion::vector to an (std/boost)::array

本文关键字:std boost 数组 向量 同质 fusion 转换      更新时间:2023-10-16

我对boost比较陌生,所以我认为这是一个简单的问题:
给定一个fusion::vector<int, int, int>,我需要一个好方法把它变成array<int, 3>

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

Live On 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);
}

基于@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);