2016-08-17 58 views
4

我寫了一個函數,joins the rows of two 2D arraysjoin_rows()函數的正確類型是什麼?

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::liststd::vector,所以我會使用模板模板paratemeter。

我可以很容易地權的函數體有兩個for循環,這不是問題,我只是在努力找出這種功能的正確類型是什麼。

(PS。我甚至不知道我上面的代碼中有最好的類型,但似乎做的工作)

+0

你可能會考慮採用這對迭代器,或者只是一個任意的容器。我認爲沒有必要使用模板模板參數。 –

+0

你甚至可以有2D矢量的「矢量」嗎?不同的數組(可以)有不同的類型,對吧? – qxz

+0

你可以給你一些如何調用這個函數的例子代碼嗎? – qxz

回答

2

我不知道如何聲明任意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對象。

相關問題