可変数の「i/o ピン」でコルーチン クラスを拡張できるようにしたいのですが、これらはメイン クラスにアクセスする必要があります。また、ピン オブジェクトに余分なポインターを追加したくありません。これは主に、それらを適切に初期化する場所を見つけるのが難しいためです。だから私は一種の回避策を見つけました:
template< int base_offs > struct pin {
int y1;
void test( void );
};
template< class pin1, class pin2 > struct wrap0 {
int x1;
char x2;
pin1 r3;
pin2 r4;
};
template< int base_offs >
void pin<base_offs>::test( void ) {
typedef wrap0< pin<0>,pin<0> > wrap;
wrap& W = *(wrap*)(((char*)this)-base_offs);
printf( "y1=%i W.x1=%i W.x2=%i\n", y1, W.x1, W.x2 );
}
typedef wrap0< pin<0>,pin<0> > wrap1;
typedef wrap0< pin< offsetof(wrap1,r3) >, pin< offsetof(wrap1,r4) > > wrap;
wrap Z = {456,123,33333,44444};
int main( void ) {
Z.r3.test();
Z.r4.test();
}
VC ビルド: http://rextester.com/MXO25153
gcc ビルド: http://ideone.com/987JP5
さて、質問:
初期クラス宣言中にoffsetofを計算する方法はありますか? (つまり、このように: http://ideone.com/tomF0T )
ラッパーアクセスの問題に対するより良いコンパイル時の解決策はありますか?