2013-03-20 2 views
0

성분 :은 Functor :-)

  1. 의도 행렬 원소 종류에 주형 매트릭스 클래스가 작동하도록 부분 행렬뿐만 아니라 double/float 등등.

  2. "참"대각선을 반환하는 matrix-member-method, 즉 NxN 부분 행렬의 경우 대각선, 즉 크기가 벡터 인 벡터 N.

  3. 가능한 한 적은 제한으로 부분 행렬을 사용하지 않을 때 불필요한 "부작용"/ 요구 사항은 없지만, 말하자면, 단지 두 배입니다.

  4. 일부 알고리즘에서 매트릭스 클래스의 연속 사용. conjugate 그래디언트는 일부 일반 매트릭스 및 벡터 유형에 템플리트 화되어야합니다.

생각

가 GetDiagonalElements에 펑을 제공 하였다() - 기본값 단지 복사 diagional 요소를 갖는 매트릭스의 제조 방법.

#include <vector> 

template< typename T > 
struct Matrix 
{ 
    std::vector<T> data; 
    Matrix() : data(1) {} 

    // Default-functor for T2=T or convertible. 
    template< typename T2 > 
    struct GetDiagonalElementsFunc 
    { 
    void operator()(const T &t1, T2 &t2) { t2 = (T2)t1; } 
    }; 

    template< typename T2, typename GetDiagonalElementsFunctor > 
    void GetDiagonalElements(std::vector<T2> &diag, 
    GetDiagonalElementsFunctor gdeFunctor=GetDiagonalElementsFunc<T2> 
    { 
     diag.resize(1) 
     gdeFunctor(data[0], diag[0]); 
    } 
}; 

void foo() 
{ 
    Matrix<double> mat; 
    std::vector<double> diag; 
    mat.GetDiagonalElements(diag); 

}

컴파일러는 "말한다": 은 'GetDiagonalElementsFunctor'에 대한 템플릿 인수를 추론 할 수없는 매트릭스 (단지 1 × 1)의 실제 크기를 무시하면, 다음은 그 기능을 제공하는 나의 시도

템플릿 인자가 필요하지 않은 것처럼 추측 해보십시오. - 노력했지만 그 중 하나 (아마도)를 얻지는 못했을 것입니다. (도움을 주셨을 지 모르겠지만), Derik.

추신 : 가능하면 이상/중간 도우미 유형이 없습니다. No Boost, no C++ 11.

추가 질문 : 대각선 액세스 펑터를 행렬 템플릿 선언 (?)의 일부로 지정하려면 어떻게해야합니까?

답변

3

당신은 C++ 98의 기능에 기본 템플릿 매개 변수를 사용하여 ... 그래서, 당신은 구조체를 사용한다, 또는 할 수없는 두 가지 기능

template< typename T2, typename Functor> 
    void GetDiagonalElements(std::vector<T2> &diag, Functor gdeFunctor) 
    { 
     diag.resize(1); 
     gdeFunctor(data[0], diag[0]); 
    } 

    template<typename T2> 
    void GetDiagonalElements(std::vector<T2>& diag) 
    { 
    GetDiagonalElements(diag, GetDiagonalElementsFunc<T2>()); 
    } 
+0

물론이 경우에 두 가지 기능 ... 예, 감사합니다, 그것은 합리적인 것 같습니다 :-) –