2016-08-17 1 views
4

나는 joins the rows of two 2D arrays하는 기능을 썼다 :join_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::list 또는 std::vector이므로 템플리트 템플릿 매개 변수를 사용합니다.

두 개의 for 루프를 사용하여 함수 본문을 쉽게 수정할 수 있습니다. 문제는 아니며, 그런 함수에 적합한 유형이 무엇인지 파악하기 위해 고심하고 있습니다.

(PS. 나는 내 위의 코드는 최선의 유형이있는 경우도 모르겠지만,이 작업을 수행하는 것), 나는 임의의 Array s의 벡터를 선언하는 방법을 잘 모르겠어요

+0

이터레이터 쌍 또는 임의의 컨테이너를 가져 오는 것이 좋습니다. 내가 생각하는 템플릿 템플릿 매개 변수에 대한 필요성은 없습니다. –

+0

2D 배열의'벡터 '를 사용할 수 있습니까? 다른 배열 (can)은 다른 유형을 가지고 있습니다. 맞습니까? – qxz

+0

이 함수를 호출하는 방법에 대한 몇 가지 예제 코드를 제공해 주시겠습니까? – qxz

답변

2

을하지만, 직접 전달 된 하나 이상의 인수를 결합하는 함수 템플리트를 구현할 수 있습니다.

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; 
} 

Eigen::Array의 동의 하나의 인수 join_rows을 제한 할 경우, 추가 사용을 설명하기 위해

// 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 
} 

예 :이 일반적으로 각 연속 인수를, 자신을 재귀 적으로 호출 처리하여 수행됩니다 std::enable_ifArrayBase<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); 
} 

큰들어s, 이것을 구현하는보다 효율적인 방법이있을 수 있습니다. 아마 하나의 새로운 Array 객체만을 할당 할 프록시 객체를 반환 할 수 있습니다.