繁体   English   中英

C++中如何实现static_cast

[英]How to implement static_cast in C++

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

Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>

Matrix<mpz_class, 3, 3> matrix;

其中 mpz_class 是 GMP 库中的数字 class。

我收到编译器错误:

 /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 转换为 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 是编译时。

如果你知道如何实现它,你可以对cast_impl模板 class 进行专门化。

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

Type1 和 Type 2 应替换为您所处情况的实际类型。

除了其他答案之外,您可能还想阅读“ Eigen: Using custom scalar types ”,了解使用自定义标量 class 的其他要求,您可能会在某个时候遇到这些问题。

假设mpz_class可以安全地子类化,您可以只使用子类并编写转换运算符:

class your_mpz_class : public mpz_class
{
public:

  // Write public constructors as needed

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM