1

GMP番号ライブラリをEigen行列ライブラリと一緒に使用しようとしています。テンプレートをインスタンス化しようとしています:

Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>

Matrix<mpz_class, 3, 3> matrix;

ここで、mpz_classはGMPライブラリの数値クラスです。

コンパイラエラーが発生します:

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

Eigenライブラリのソースコードを調べると、問題は、このテンプレートでmpz_classをintにstatic_cast-edできないことであることがわかりました。

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はコンパイル時であるため、コンパイラーが実行する必要があります。

4

3 に答える 3

7

それを実装する方法を知っている場合は、cast_implテンプレートクラスを特殊化することができます。

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

タイプ1とタイプ2は、状況に応じて実際のタイプに置き換える必要があります。

于 2012-04-10T11:45:52.863 に答える
5

他の回答に加えて、ある時点でヒットする可能性のあるカスタムスカラークラスを使用する他の要件については、 「 Eigen:カスタムスカラータイプの使用」をお読みください。

于 2012-04-10T11:46:36.893 に答える
3

サブクラス化しても安全であると仮定するとmpz_class、サブクラスを使用して変換演算子を記述できます。

class your_mpz_class : public mpz_class
{
public:

  // Write public constructors as needed

  operator int()
  {
    return /* Whatever must be returned */;
  }
};
于 2012-04-10T11:43:13.817 に答える