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);
を使用! 'WolframLibrary.h'にあるものを修正してこの作業をする必要があるようですが、これは避けたいものです。 '" WolframLibrary.m "'がすでに読み込まれた後にこの作業をすることは可能ですか? – QuantumDot
@QuantumDot、私は恐れていません。 –
私はちょうどあなたの編集を見て、それは行くために非常に合理的な方法のように見えます。パフォーマンス上の理由から、これらの関数をインライン化することは可能ですか? 'inline mcomplex to_mcomplex(std :: complex const&c)'など... –
QuantumDot