[英]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.