我希望能够使用可变数量的“i/o 引脚”扩展我的协程类,但这些需要访问主类。此外,我不想添加额外的指针到 pin 对象,主要是因为很难找到正确初始化它们的地方。所以我找到了一种解决方法:
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)
包装器访问问题是否有更好的编译时解决方案?