gpt4 book ai didi

c++ - 在两个元素的数组之间转换 std::complex。

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:45 25 4
gpt4 key购买 nike

"WolframLibrary.h"使用结构表示复数:

typedef struct {double ri[2];} mcomplex;
#define mcreal(mc) (((mc).ri)[0])
#define mcimag(mc) (((mc).ri)[1])

这只是一个包含两个元素的数组。标准库头 <complex>定义不同。我想让编译器使用 = 在两者之间自动转换运营商,但我不知道如何。假设

mcomplex z1 = {3.2, 1.1};   //  <-- this is z1 = 3.2 + 1.1 I
std::complex<double> z2(-4.0, 0.5); // <-- this is z2 = -4.0 + 0.5 I

我如何告诉编译器 z1 = z2在我的程序中意味着 mcreal(z1) = real(z2); mcimag(z1) = imag(z2); ,反之亦然?

最佳答案

能够使用的最简单的方法

z1 = z2;

是提供一个来自std::complex<double>的转换构造函数至 mcomplex .

然后,您可以使用:

std::complex<double> z2(-4.0, 0.5);
mcomplex z1 = z2;

mcomplex z1 = {3.2, 1.1}; 
std::complex<double> z2(-4.0, 0.5);
z1 = z2;

为了能够以其他方式使用这些操作,您需要从 mcomplex 提供一个用户定义的转换运算符。至 std::complex<double> .

终于不用typedef struct {...} mcomplex;了.只需使用 struct mcomplex { ... };

这是为我成功构建的程序。请注意 main是故意为空的。它只是演示mcomplex之间的合法操作。和 std::complex<double> .

#include <complex>

struct mcomplex
{
mcomplex(double re = 0, double im = 0)
{
ri[0] = re;
ri[1] = im;
}

// Converting constructor.
mcomplex(std::complex<double> const& c) : mcomplex(c.real(), c.imag()) {}

// User defined conversion operator
operator std::complex<double> () const
{
return {ri[0], ri[1]};
}

double ri[2];
};

void test1()
{
std::complex<double> z2(-4.0, 0.5);
mcomplex z1 = z2;
(void)z1; // Shut up the compiler
}

void test2()
{
mcomplex z1 = {3.2, 1.1};
std::complex<double> z2(-4.0, 0.5);
z1 = z2;
}

void test3()
{
mcomplex z1 = {3.2, 1.1};
std::complex<double> z2 = z1;
(void)z2; // Shut up the compiler
}

void test4()
{
mcomplex z1 = {3.2, 1.1};
std::complex<double> z2(-4.0, 0.5);
z2 = z1;
}

int main()
{
}

如果您没有修改 mcomplex 定义的选项,您最好的选择是提供几个非成员函数来进行转换。

namespace MyApp
{
mcomplex to_mcomplex(std::complex<double> const& c )
{
return mcomplex{c.real(), c.imag()};
}

std::complex<double> to_std_complex(mcomplex const& c)
{
return {c.re[0], c.re[1]};
}
}

然后使用

std::complex<double> z1(-4.0, 0.5);
mcomplex z2 = MyApp::to_mcomplex(z1);

mcomplex z1 = {3.2, 1.1}; 
std::complex<double> z2 = MyApp::to_std_complex(z1);

关于c++ - 在两个元素的数组之间转换 std::complex。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44771824/

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