2012-04-10 2 views
1

고유 행렬 라이브러리와 함께 GMP 번호 라이브러리를 사용하려고합니다. 나는 템플릿을 인스턴스화하려고 :C++에서 static_cast를 구현하는 방법

Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime> 

mpz_class는 GMP 라이브러리의 숫자 클래스입니다

Matrix<mpz_class, 3, 3> matrix; 

와 함께. 문제가 mpz_class이 템플릿에서 int로 -ed static_cast 할 수 없다는 것을, 나는 아이겐 라이브러리의 소스 코드를 검사 할 때

/usr/include/eigen3/Eigen/src/Core/MathFunctions.h:409: error: 
invalid static_cast from  
type ‘const __gmp_expr<__mpz_struct [1], __mpz_struct [1]>’ 
to type ‘int’ 

, 내가 알아 :

나는 컴파일러 오류가 발생합니다 :

template<typename OldType, typename NewType> 
struct cast_impl 
{ 
    static inline NewType run(const OldType& x) 
    { 
    return static_cast<NewType>(x); 
    } 
}; 

어떻게하면이 문제를 피할 수 있습니까? 런타임시 mpz_class를 int로 변환하는 방법을 알고 있지만 static_cast는 컴파일 시간이므로 컴파일러가 수행해야합니다.

답변

2

mpz_class 가정하면 서브 클래스에 안전합니다, 당신은 단지 서브 클래스를 사용하고 변환 연산자를 쓸 수 있습니다 :

class your_mpz_class : public mpz_class 
{ 
public: 

    // Write public constructors as needed 

    operator int() 
    { 
    return /* Whatever must be returned */; 
    } 
}; 
+0

당신은 하위 클래스 인 mpz_class를 추가하고이 연산자 int()를 추가합니까? –

+0

아, 정말 좋은 해결책이 될 것입니다. 물론'mpz_class'를 하위 클래스 화하는 것이 안전하다고 가정합니다. – Gorpik

+0

이를 반영하여 답변을 업데이트했습니다. – Gorpik

6

당신이 cast_impl 템플릿 클래스의 전문화를 할 수 그것을 구현하는 방법을 알고 있다면.

template <> 
struct cast_impl<Type1, Typ2> 
{ 
    static inline Type2 run(const Type1&x) { 
     // Conversion here returning Type2 from Type1 
    } 
} 

유형 1과 유형 2는 상황에 따라 실제 유형으로 대체되어야합니다.

+0

'cast_impl'은'run()'함수 만 포함한다고 가정하면,이 솔루션은이 특별한 경우보다 훨씬 좋아 보입니다. 물론, OP가 관련 기능을 표시하고 나머지 수업을 건너 뛰었을 수도 있습니다. 모르겠습니다. – Gorpik

5

다른 답변 외에도 "Eigen: Using custom scalar types"을 읽으면 특정 시점에 맞을 가능성이있는 사용자 지정 스칼라 클래스를 사용하기위한 다른 요구 사항을 읽을 수 있습니다.

+0

감사합니다. 나는 하나씩 오류를 치고있다. 나는 이것을 먼저 읽는 것이 좋습니다. –

관련 문제