C のレガシー コードで使用されている 2 つの大きな C 構造体があり、一方から他方へ、またはその逆に変換する必要があります。このようなもの :
#include <iostream>
struct A {
int a;
float b;
};
struct B {
char a;
int b;
};
struct C {
A a;
B b;
};
struct D {
int a;
char b;
float c;
};
void CtoD( const C& c, D &d ) {
d.a = c.a.a;
d.b = c.b.a;
d.c = c.a.b;
}
void DtoC( const D &d, C& c ) {
c.a.a = d.a;
c.b.a = d.b;
c.a.b = d.c;
}
int main()
{
C c = { { 1, 3.3f }, { 'a', 4 } };
D d = { 1, 'b', 5.5f };
#if 0
CtoD( c, d );
#else
DtoC( d, c );
#endif
std::cout<<"C="<<c.a.a<<" "<<c.a.b<<" "<<c.b.a<<" "<<c.b.b<<std::endl;
std::cout<<"D="<<d.a<<" "<<d.b<<" "<<d.c<<std::endl;
}
関数CtoD
とDtoC
は同じことをしていますが、反対方向です。1 つの構造を変更するには、両方を変更する必要があります。
エラーの可能性を最小限に抑え、繰り返しを避けるために、接続を一度だけ定義してから、ある値を別の値にコピーする、ある種のマッピングを実装したいと思います。このように、構造が変更された場合に必要な変更は 1 つだけです。
それで、問題は次のとおりです。それを行う方法は?おそらく使用できるデザインパターンはありますか?
私の実際の構造には何百ものフィールドがあります。上記は単純化した例です。