最簡單的方法能夠使用
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是故意的。它只是演示了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);
這是非常好的!似乎我需要修改'WolframLibrary.h'中的內容來使這項工作成爲可能,我寧願避免這一點。 ''WolframLibrary.m''已經被加載後可以做這個工作嗎? – QuantumDot
@QuantumDot,恐怕不是。 –
我剛剛看到你的編輯,它看起來像一個非常合理的方式去。出於性能原因,是否可以內聯這些功能?我在想'內聯複雜to_mcomplex(std :: complex const&c)'等等...... –
QuantumDot