qua*_*dev 5 c++ templates boost boost-multi-array
我对这段代码有问题:
#include <boost/multi_array.hpp>
#include <boost/array.hpp>
#include <vector>
#include <iostream>
template <typename Vec>
void foo(Vec& x, size_t N)
{
for (size_t i = 0; i < N; ++i) {
x[i] = i;
}
}
int main()
{
std::vector<double> v1(10);
foo(v1, 5);
std::cout << v1[4] << std::endl;
boost::multi_array<double, 2> m1;
boost::array<double, 2> shape;
shape[0] = 10;
shape[1] = 10;
m1.resize(shape);
foo(m1[0], 5);
std::cout << m1[0][4] << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
尝试用gcc编译它,我收到错误:
boost_multi_array.cpp: In function 'int main()':
boost_multi_array.cpp:26: error: invalid initialization of non-const reference of type 'boost::detail::multi_array::sub_array<double, 1u>&' from a temporary of type 'boost::detail::multi_array::sub_array<double, 1u>'
boost_multi_array.cpp:7: error: in passing argument 1 of 'void foo(Vec&, size_t) [with Vec = boost::detail::multi_array::sub_array<double, 1u>]'
Run Code Online (Sandbox Code Playgroud)
它的工作原理如预期的boost :: multi_array中当我改变的函数的第一个参数的类型foo从Vec&到Vec,但随后的std ::向量是按值传递,这不是我想要的.如何在不编写两个模板的情况下实现目标?
问题是,对于NumDims > 1,operator[]返回类型为 的临时对象template subarray<NumDims-1>::type。
一个(不太好的)解决方法如下:
typedef boost::multi_array<double, 2> MA;
MA m1;
MA::reference ref = m1[0];
foo(ref, 5); // ref is no temporary now
Run Code Online (Sandbox Code Playgroud)
另一种方法是包装您的实现并为多数组情况提供重载......例如:
(注意:我没有看到如何让重载工作boost::multi_array<T,N>::reference,请不要将此detail::版本投入生产使用;)
template<class T>
void foo_impl(T x, size_t N) {
for (size_t i = 0; i < N; ++i) {
x[i] = i;
}
}
template<class T>
void foo(T& t, size_t n) {
foo_impl<T&>(t, n);
}
template<typename T, size_t size>
void foo(boost::detail::multi_array::sub_array<T, size> r, size_t n) {
foo_impl(r, n);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1882 次 |
| 最近记录: |