2017-06-27 71 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

相關問題