使C ++自动将int转换为double

时间:2018-09-10 14:40:10

标签: c++ implicit-conversion ceres-solver

当我有一个数字类型,该类型将operator<定义为double而不是int时,与int文字的比较不起作用。这是一个问题,因为标准库的一部分,即std::complex包含int文字。

使用类型时,我可以让编译器将int文字视为双精度吗?

简化示例:

// the defined operator
template<typename T>
bool operator<(const Type<T> &lhs, const T &rhs);

complex<Type<T>> complex_number;
1.0 / complex_number; // this fails

失败发生在{p>的_Div的{​​{1}}方法内部

std::complex

这会导致错误:

template<class _Other> inline
void _Div(const complex<_Other>& _Right)
    // ...
    else if ((_Rightimag < 0 ? -_Rightimag : +_Rightimag)

我认为error C2678: binary '<': no operator found which takes a left-hand operand of type 'Type<T>' (or there is no acceptable conversion) (...) complex(665): note: while trying to match the argument list '(Type<T>, int)' [ T=double ] 中的代码应该是std::complex以使用所有数字类型,但是我必须使用stdlib提供的内容。

由于其他类型也来自库,因此我正在寻找一种将隐式转换添加到代码中的方法。


对于实际代码:我使用的是ceres,它可以让您定义带有模板标量类型的函子以进行自动微分。标量被评估为_Rightimag < static_cast<_Other>(0)T

defines Jet<T, N>范围,允许operator<(const Jet<T, N>&, const T&),但不允许jet < 0.0

在我的代码中,我可以通过使用双精度数或将整数显式转换为模板类型jet < 0来解决此问题,但是当我尝试使用T时,比较的方法会遇到麻烦针对整数文字,例如上面的complex<T>方法。

2 个答案:

答案 0 :(得分:5)

std::complex模板不需要用于常规类型。标准说[complex.numbers] / 2:

  

对于complexfloatdouble以外的任何类型的实例化模板long double的效果未指定。

如果您需要将任何其他类似数字的类型概括为类似复杂的类型,则应该使用一些其他的库或实现自己的库。

答案 1 :(得分:0)

是的,您可以通过定义一个采用单个参数(要转换的类型)的构造函数来进行隐式转换。