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

时间:2017-06-27 03:28:18

标签: c++ arrays types

"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);,反之亦然?

1 个答案:

答案 0 :(得分:2)

能够使用

的最简单方法
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;

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

最后,无需使用typedef struct {...} mcomplex;。只需使用struct mcomplex { ... };

即可

这是为我成功构建的程序。请注意,main有意为空。它只是演示mcomplexstd::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);