成员访问没有运行时指针的包装类
member access to wrapper class without runtime pointers
我希望能够使用变量数扩展我的协程类的"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=%in", 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
海湾合作委员会版本:http://ideone.com/987JP5
现在,问题:
有没有办法在初始类声明期间计算偏移量?(即像这样:http://ideone.com/tomF0T)
对于包装器访问问题,是否有更好的编译时解决方案?
好吧,这里有一个版本,但 VC 不支持它。英特尔C和gcc虽然有。
template< class wrap, class pad, pad wrap::*X > struct pin {
int y1;
void test( void ) {
wrap& W = *(wrap*)(((char*)this) - size_t(&(((wrap*)0)->*X)) - sizeof(pad));
printf( "y1=%i W.x1=%i W.x2=%in", y1, W.x1, W.x2 );
}
};
struct wrap {
int x1;
char x2;
typedef pin< wrap, char, &wrap::x2 > r3_t;
r3_t r3;
typedef pin< wrap, r3_t, &wrap::r3 > r4_t;
r4_t r4;
};
wrap Z = {456,123,33333,44444};
int main( void ) {
Z.r3.test();
Z.r4.test();
}
VC: http://rextester.com/QFY31637海湾合作委员会:http://rextester.com/HEN91787
这是另一个版本,可能是最后一个版本,因为它与VC和gcc兼容,并且并不真正有任何烦人的副作用。当然,函数通常不是"编译时",而是在无论如何,这种情况都是内联并优化为常量。
template< class wrap, int (*base_offs)(void) > struct pin {
int y1;
void test( void ) {
wrap& W = *(wrap*)(((char*)this) - ((*base_offs)()) );
printf( "ofs=%i y1=%i W.x1=%i W.x2=%in", ((*base_offs)()), y1, W.x1, W.x2 );
}
};
struct wrap {
int x1;
char x2;
static int get_r3(void) { return offsetof(wrap,r3); }
pin< wrap, get_r3 > r3;
static int get_r4(void) { return offsetof(wrap,r4); }
pin< wrap, get_r4 > r4;
};
wrap Z = {456,123,33333,44444};
int main( void ) {
Z.r3.test();
Z.r4.test();
}
VC: http://rextester.com/NPBY12766海湾合作委员会:http://rextester.com/XWI48752
相关文章:
- 优先顺序:智能指针和类析构函数
- 深层复制具有自引用指针的类
- 通过函数指针定义类范围之外的方法
- 使用指针的类识别
- 如何创建存储指向成员函数的指针的类 (C++)
- 我无法使用C++指针指向类方法返回的 std::vector
- 作为指针注入类后重新创建堆栈对象不好吗?
- decltype:使用指针访问类的静态成员
- 指针类型类成员的动态强制转换的恒定性是什么?
- 如何正确实现具有原始指针的类的复制构造函数?
- 指针和类,输出
- cppyy 继承包含智能指针的类
- 简化在 Pybind11 中为 C++ 模板类生成包装类:模板声明不能出现在块范围内
- 如何动态分配由三重指针到类的矩阵?
- C++-用与被包装数据相同的语法构造包装类
- 编写安全包装类以管理用户定义对象的指针
- 简单包装类与智能指针
- 成员访问没有运行时指针的包装类
- 通过包装对象上的函数指针调用类方法出错
- 指针包装类-行为就像一个原始指针