我不知道如何聲明任意Array
s的載體,但您可以實現一個函數模板,它將直接傳遞給它的一個或多個參數組合起來。
// 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
S,加上這通常是通過調用自身遞歸,處理每個連續的參數進行用於ArrayBase<T>
基類的std::enable_if
檢查:
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
對象。
來源
2016-08-20 02:14:40
qxz
你可能會考慮採用這對迭代器,或者只是一個任意的容器。我認爲沒有必要使用模板模板參數。 –
你甚至可以有2D矢量的「矢量」嗎?不同的數組(可以)有不同的類型,對吧? – qxz
你可以給你一些如何調用這個函數的例子代碼嗎? – qxz