使C++自动将int转换为double
Make C++ automatically convert int to double
当我有一个数值类型时,它为双精度定义了 operator<
,但没有为 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
失败发生在 std::complex
的 _Div
方法内
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
中的代码可能应该是 _Rightimag < static_cast<_Other>(0)
以处理所有数字类型,但我必须使用 stdlib 提供的内容。
由于另一种类型也来自库,我正在寻找一种方法将隐式转换添加到我的代码中。
对于实际代码:我正在使用 ceres,它允许您使用模板化标量类型定义函子以进行自动微分。标量被评估为 T
和 Jet<T, N>
.
Ceres defines operator<(const Jet<T, N>&, const T&)
,它允许 jet < 0.0
但不允许 jet < 0
。
在我的代码中,我可以通过使用双精度数或将整数显式转换为模板类型 T
来解决这个问题,但是当我尝试使用 complex<T>
时,我遇到了方法上的麻烦与整数文字进行比较,如上面的 _Div
方法。
是的,您可以通过定义一个采用单个参数(您正在转换的类型)的构造函数来获得隐式转换。
使用一般类型不需要 std::complex
模板。标准说 [complex.numbers]/2:
The effect of instantiating the template complex
for any type other than float
, double
, or long double
is unspecified.
如果您需要将任何其他类似数字的类型泛化为类似复杂的类型,您应该使用一些不同的库或实现您自己的库。
当我有一个数值类型时,它为双精度定义了 operator<
,但没有为 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
失败发生在 std::complex
的 _Div
方法内
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
中的代码可能应该是 _Rightimag < static_cast<_Other>(0)
以处理所有数字类型,但我必须使用 stdlib 提供的内容。
由于另一种类型也来自库,我正在寻找一种方法将隐式转换添加到我的代码中。
对于实际代码:我正在使用 ceres,它允许您使用模板化标量类型定义函子以进行自动微分。标量被评估为 T
和 Jet<T, N>
.
Ceres defines operator<(const Jet<T, N>&, const T&)
,它允许 jet < 0.0
但不允许 jet < 0
。
在我的代码中,我可以通过使用双精度数或将整数显式转换为模板类型 T
来解决这个问题,但是当我尝试使用 complex<T>
时,我遇到了方法上的麻烦与整数文字进行比较,如上面的 _Div
方法。
是的,您可以通过定义一个采用单个参数(您正在转换的类型)的构造函数来获得隐式转换。
使用一般类型不需要 std::complex
模板。标准说 [complex.numbers]/2:
The effect of instantiating the template
complex
for any type other thanfloat
,double
, orlong double
is unspecified.
如果您需要将任何其他类似数字的类型泛化为类似复杂的类型,您应该使用一些不同的库或实现您自己的库。