1

我正在尝试将 GMP 编号库与特征矩阵库一起使用。我尝试实例化模板:

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 在这个模板中不能被 static_cast -ed 到 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 是编译时。

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

除了其他答案之外,您可能还想阅读“特征:使用自定义标量类型”以了解使用自定义标量类的其他要求,您可能会在某些时候遇到这些要求。

于 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 回答