"WolframLibrary.h"
使用struct表示复数:
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);