gpt4 book ai didi

c++ - 使用 std::complex 为 `*` 操作将 int 转换为 double

转载 作者:行者123 更新时间:2023-11-27 22:34:16 25 4
gpt4 key购买 nike

我是一名物理学家,试图尽量减少在用于计算的代码文件(方程式和函数)中键入类型转换和强制转换。计算通常涉及复数。所以我扩展了 complex<double>输入 cd为了紧凑并添加了一些帮助方法。

class cd: public complex<double> { ... }

扩展而不是仅仅使用 typedef 的原因是为了让物理符号 ( string ) 和物理单位 ( string ) 可以与物理变量一起存储。

现在如果在计算中我有这样的实例

int i = 2;
cd z(1,2);
cout << i*z;

这会产生错误,因为没有运算符将 int 相乘和 cd . (老实说,我认为 C++ 会自动将 int 隐式转换为 double 并使用相关的运算符。)在手动定义这样的运算符后

cd operator*(const int& i, const cd& z)
{
return cd(i*z.real(),i*z.imag());
}

c++ 然后警告像

这样的部分类型转换的歧义
double x = 30;
x*z;

在下面x是一个 double 和 Icd .

 error: ambiguous overload for ‘operator*’ (operand types are ‘double’ and ‘const cd’)
return pow(eps1/e0*kz2,2)-pow(eps2/e0*kz1*tanh(dist*1e-10*kz1/( x *I)),2);
~~~^~
In file included from libs/calc/include/calculation.h:12:0,
from scripts/dist_dependence.cpp:2:
libs/calc/include/complex_double.h:49:4: note: candidate: cd operator*(const int&, const cd&)
cd operator*(const int& x, const cd& z)

因为手动运算符(operator)定义(上面)也可以用于 doublecd - 已在标准库中定义。

现在上面的问题可以通过定义来解决

cd operator*(const double& x, const cd& z)
{
return cd(x*z.real(),x*z.imag());
}

但是这会阻止以下情况:

除此之外,我还想从 cd 进行转换至 double这样就可以将复数(无需显式转换)传递给采用实数(double 类型)参数的函数。 (如果虚部为零,则将 cd 转换为 double,否则会抛出错误或其他内容)。问题是当我定义(除了 double - cd 运算符 * :

operator double() {
if (imag()==0.0) return real();
throw "trying to cast a cd with non-zero imaginary part to double";
}

cd里面类。

它吐出以下内容:

 warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:

只有 operator*例如已在此处给出,但我也想对其他数学二元运算执行此操作。

最佳答案

你的问题在这里:

So I extended the complex<double> type as cd

这是初学者常犯的错误,他们认为继承是所有问题的答案,而实际上它是许多问题的根源。

只需定义一个没有继承的工作类型,一切都会开箱即用:

using cd = std::complex<double>;
constexpr cd i{0 , 1};

int main (int , char **)
{
cd x{ 1, 3};

std::cout << x << '\n';
std::cout << x*i << '\n';

std::cout << x*i + 3.2 << '\n';

return 0;
}

https://wandbox.org/permlink/OfOfonJFrTInR0ib

免责声明:cd不是此符号的最佳名称。考虑一些更具描述性的东西

关于c++ - 使用 std::complex<double> 为 `*` 操作将 int 转换为 double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56953577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com