2017-06-27 50 views
2

"WolframLibrary.h"表示使用结构复杂的数字:在两个元素的数组之间转换std :: complex。

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

回答

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; 

为了能够使用该业务的另一种方式,你需要从mcomplex提供用户定义的转换操作符std::complex<double>。最后,没有必要使用typedef struct {...} mcomplex;。只需使用struct mcomplex { ... };

下面是为我成功构建的程序。请注意0​​是故意的。它只是演示了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); 
+0

这是非常好的!似乎我需要修改'WolframLibrary.h'中的内容来使这项工作成为可能,我宁愿避免这一点。 ''WolframLibrary.m''已经被加载后可以做这个工作吗? – QuantumDot

+0

@QuantumDot,恐怕不是。 –

+0

我刚刚看到你的编辑,它看​​起来像一个非常合理的方式去。出于性能原因,是否可以内联这些功能?我在想'内联复杂to_mcomplex(std :: complex const&c)'等等...... – QuantumDot

相关问题