我写了一个joins the rows of two 2D arrays:
的函数template <typename S, typename T>
Array<typename S::Scalar, Dynamic, Dynamic> join_rows(const ArrayBase<S> & A, const ArrayBase<T> & B) {
Array<typename S::Scalar, Dynamic, Dynamic> C (A.rows(), A.cols()+B.cols());
C << A, B;
return C;
}
我想编写一个可以连接两个以上数组的更通用的函数。
它应该能够与任何可迭代容器一起使用,例如。 std::list
或std::vector
,所以我会使用模板模板paratemeter。
我可以很容易地用两个for循环来修正函数体,这不是问题,我只是在努力弄清楚这个函数的正确类型是什么。
(ps。我甚至不确定我的上述代码是否具有最佳类型,但它似乎可以完成这项工作)
答案 0 :(得分:2)
我不确定如何声明任意Array
的向量,但是你可以实现一个函数模板,它结合了一个或多个直接传递给它的参数。这通常通过递归调用自身,处理每个连续的参数来完成:
// end case (one argument): just forward the same array
template <typename T>
T&& join_rows(T&& A) {
return std::forward<T>(A);
}
// main function template: two or more arguments
template <typename S, typename T, typename... R>
Array<typename S::Scalar, Dynamic, Dynamic> join_rows(const ArrayBase<S>& A,
const ArrayBase<T>& B,
const ArrayBase<R>&... rest) {
Array<typename S::Scalar, Dynamic, Dynamic> C(A.rows(), A.cols()+B.cols());
C << A, B;
return join_rows(C, rest...); // call with the first two arguments combined
}
说明用法的示例:
int main() {
Array<int, 1, 3> arr1 = {1, 2, 3};
Array<int, 1, 2> arr2 = {4, 5};
Array<int, 1, 4> arr3 = {9, 8, 7, 6};
cout << join_rows(arr1, arr2, arr3.reverse()) << endl; // 1 2 3 4 5 6 7 8 9
return 0;
}
如果您想将单参数join_rows
限制为仅接受Eigen::Array
,请为std::enable_if
基类添加ArrayBase<T>
检查:
template <typename T>
std::enable_if_t<std::is_base_of<ArrayBase<std::decay_t<T>>,std::decay_t<T>>::value, T&&>
join_rows(T&& A) {
return std::forward<T>(A);
}
对于大型Array
,可能有更有效的方法来实现它。您可能会返回一个仅分配一个新Array
对象的代理对象。