我有一个由
double
组成的 3D 数组。我想编写简单且通用的函数来打印它的 2D 切片。
代码:
#include <cstdio>
#include <boost/multi_array.hpp>
template<class M> // any model of MultiArray concept
void printFloatMatrix(typename M::template array_view<2u>::type matrix) {
using std::printf;
for(auto& row : matrix) {
for(auto& elem : row) {
printf("%5.3f ", elem);
}
printf("\n");
}
}
int main() {
typedef boost::multi_array<double,3> data_t;
data_t test_matrix{data_t::extent_gen()[10][10][2]};
// ...
using boost::indices;
using boost::multi_array_types::index_range;
printFloatMatrix(test_matrix[ indices[index_range()] [index_range()] [0] ]);
}
使用 GCC 会产生错误消息:
test.cpp: In function ‘int main()’:
test.cpp:24:79: error: no matching function for call to ‘printFloatMatrix(boost::multi_array_ref<double, 3u>::array_view<2u>::type)’
test.cpp:24:79: note: candidate is:
test.cpp:5:6: note: template<class M> void printFloatMatrix(typename M::array_view<2u>::type)
为什么会出错?
为什么
M
不被推断为boost::multi_array_ref<double, 3u>
?
如何编写可行的原型?
我无法拼写 C++ 类型推断失败的确切原因,但将函数原型更改为
template<class M> void printFloatMatrix(const M& matrix)
有效。
不过,原型现在已经毫无用处了。将来它很有可能会咬我。这种情况有望随着概念的出现而得到解决,或者可以通过静态断言来解决。
感谢 Freenode 的
##c++
。
当然,你必须限制你的论点:
template<class M,
std::enable_if_t<M::dimensionality == 2 and std::is_same_v<typename M::element, float>, int> =0
>
void printFloatMatrix(const M& matrix)