(c ++)在boost multi_array中存储lambda函数

时间:2016-06-29 12:47:19

标签: c++ function boost multidimensional-array lambda

我的计划是在boost库的多维数组multi_array中存储数百(甚至数千)个(插值)函数。我需要存储它们,因为我需要在项目的不同点调用它们,不同的数字作为参数。 (我正在使用linterp库http://rncarpio.github.io/linterp/来创建插值函数。)

我可以将函数存储在如下的向量中:

// creating the vector, storing the function
std::vector< std::function< double(double *x) > > interp_list(4);
// storing the function in the vector
interp_list[0] = ( [&] (double *x) { return interp1.interp(x); }  );

但是,对多维数组进行相同的操作总会导致编译错误:

// creating the array, I want to store the functions in
boost::multi_array< std::function<double (std::vector<double>::iterator)>, 2> interp2_list[2][2];
// storing the function in the vector
interp2_list[0][0] = ( [&] (std::vector<double>::iterator x) { return interp1.interp(x); }  );

我对函数至少有“7维”(例如interp_list [6] [2] [3] [3] [64] [12] [2]),因此喜欢循环它。

编辑1.0: 添加错误消息:

在/usr/include/boost/multi_array.hpp:26:0中包含的文件中,                  从./StoreInterp.cpp:16: /usr/include/boost/multi_array/multi_array_ref.hpp:在Instanziierung von»boost :: multi_array_ref&amp;提高:: multi_array_ref的运算:: erator =(const ConstMultiArray&amp;)[with ConstMultiArray = main():::: iterator)&gt ;; T = std :: function&gt;)&gt ;; long unsigned int NumDims = 2ul]«: /usr/include/boost/multi_array.hpp:371:26:erfordert durch»boost :: multi_array&amp;提高:: multi_array的::Ø perator =(const ConstMultiArray&amp;)[with ConstMultiArray = main():::: iterator)&gt ;; T = std :: function&gt;)&gt ;; long unsigned int NumDims = 2ul; Allocator = std :: allocator&gt;)&gt; &GT;]« ./StoreInterp.cpp:108:22:von hier erfordert /usr/include/boost/multi_array/multi_array_ref.hpp:482:30:Fehler:»const struct main():::: iterator)&gt;«没有成员命名  »num_dimensions«      BOOST_ASSERT(other.num_dimensions()== this-&gt; num_dimensions());

1 个答案:

答案 0 :(得分:0)

您对interp2_list的声明是错误的,您声明的是具有2维的boost::multi_array<>的二维数组,因此您获得了第一维的范围2的4-D“事物”但最后两个维度没有任何范围。

您真正想要的是使用正确尺寸初始化的单个boost::multi_array<>

boost::multi_array< std::function<double (std::vector<double>::iterator)>, 2> 
    interp2_list(boost::extents[2][2]);

请参阅boost documentation