如何将同构 fusion::vector 转换为 (std/boost)::array
How to convert a homogeneous fusion::vector to an (std/boost)::array
我对 boost 比较陌生,所以我认为这是一个简单的问题:
给定一个 fusion::vector<int, int, int>
,我需要一个好方法将它变成 array<int, 3>
.
您可以只使用 array<>
(std 或 boost)和 copy
的内置适配:
#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);
我对 boost 比较陌生,所以我认为这是一个简单的问题:
给定一个 fusion::vector<int, int, int>
,我需要一个好方法将它变成 array<int, 3>
.
您可以只使用 array<>
(std 或 boost)和 copy
的内置适配:
#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);