#include <stdio.h>
void te1(){
printf("te1 %llu\n",te1);
}
struct A{
static void te2(){
printf("te2 %llu\n",te2);
}
void te3(){
printf("te3 %llu\n",this);
}
static void te4(){
printf("te2 %llu\n",te2);
}
};
int main(void)
{
A a;
printf("%llu %llu %llu\n",sizeof(&te1),sizeof(&A::te2),sizeof(&A::te3));
//Проблема начинается с того, что размер указателя на метод - 16,
//вместо 8 для обычного указателя на функцию или статический
using fun=void(*)(void);
typedef void(A::* met)(void); //Я не знаю как это через using записывается
union{
void* a[2];
met prt;
} t;
t.prt=&A::te3;
printf("union %llu %llu\n",t.a[0],t.a[1]);
//В первой ячейке адрес, во второй 0.
printf("&a:%llu te2:%llu te4:%llu\n",&a,&A::te2,&A::te4);
//Адерс te3 где-то между te2 и te4
//Ну - у меня на компьютере, на ideone уже по другому - но всё-равно рядом
union{
void* a[1];
fun prt;
} ww;
ww.a[0]=t.a[0];
//Попробую вызвать
ww.prt();
//Метод вызывается, но по указателю this в методе мусор
using fun2=void(*)(void*);//Попробую так (методы вроде как принимаю указатель на структуру первым аргументом)
union{
void* a[1];
fun2 prt;
} qq;
qq.a[0]=t.a[0];
qq.prt((void*)123u);//Работает
return 0;
}
CiNpbmNsdWRlIDxzdGRpby5oPgoKCnZvaWQgdGUxKCl7CglwcmludGYoInRlMSAlbGx1XG4iLHRlMSk7Cn0KCnN0cnVjdCBBewoJc3RhdGljIHZvaWQgdGUyKCl7CgkJcHJpbnRmKCJ0ZTIgJWxsdVxuIix0ZTIpOwoJfQoKCXZvaWQgdGUzKCl7CgkJcHJpbnRmKCJ0ZTMgJWxsdVxuIix0aGlzKTsKCX0KCXN0YXRpYyB2b2lkIHRlNCgpewoJCXByaW50ZigidGUyICVsbHVcbiIsdGUyKTsKCX0KCn07CgppbnQgbWFpbih2b2lkKQp7CglBIGE7CglwcmludGYoIiVsbHUgJWxsdSAlbGx1XG4iLHNpemVvZigmdGUxKSxzaXplb2YoJkE6OnRlMiksc2l6ZW9mKCZBOjp0ZTMpKTsKCS8v0J/RgNC+0LHQu9C10LzQsCDQvdCw0YfQuNC90LDQtdGC0YHRjyDRgSDRgtC+0LPQviwg0YfRgtC+INGA0LDQt9C80LXRgCDRg9C60LDQt9Cw0YLQtdC70Y8g0L3QsCDQvNC10YLQvtC0IC0gMTYsCgkvL9Cy0LzQtdGB0YLQviA4INC00LvRjyDQvtCx0YvRh9C90L7Qs9C+INGD0LrQsNC30LDRgtC10LvRjyDQvdCwINGE0YPQvdC60YbQuNGOINC40LvQuCDRgdGC0LDRgtC40YfQtdGB0LrQuNC5CgoKCXVzaW5nIGZ1bj12b2lkKCopKHZvaWQpOwoJdHlwZWRlZiB2b2lkKEE6OiogbWV0KSh2b2lkKTsgLy/QryDQvdC1INC30L3QsNGOINC60LDQuiDRjdGC0L4g0YfQtdGA0LXQtyB1c2luZyDQt9Cw0L/QuNGB0YvQstCw0LXRgtGB0Y8KCXVuaW9uewoJdm9pZCogYVsyXTsKCW1ldCBwcnQ7Cgl9IHQ7Cgl0LnBydD0mQTo6dGUzOwoJcHJpbnRmKCJ1bmlvbiAlbGx1ICVsbHVcbiIsdC5hWzBdLHQuYVsxXSk7CgkvL9CSINC/0LXRgNCy0L7QuSDRj9GH0LXQudC60LUg0LDQtNGA0LXRgSwg0LLQviDQstGC0L7RgNC+0LkgMC4KCglwcmludGYoIiZhOiVsbHUgdGUyOiVsbHUgdGU0OiVsbHVcbiIsJmEsJkE6OnRlMiwmQTo6dGU0KTsKCS8v0JDQtNC10YDRgSB0ZTMg0LPQtNC1LdGC0L4g0LzQtdC20LTRgyB0ZTIg0LggdGU0CgkvL9Cd0YMgLSDRgyDQvNC10L3RjyDQvdCwINC60L7QvNC/0YzRjtGC0LXRgNC1LCDQvdCwIGlkZW9uZSDRg9C20LUg0L/QviDQtNGA0YPQs9C+0LzRgyAtINC90L4g0LLRgdGRLdGA0LDQstC90L4g0YDRj9C00L7QvAoKCXVuaW9uewoJdm9pZCogYVsxXTsKCWZ1biBwcnQ7Cgl9IHd3OwoJd3cuYVswXT10LmFbMF07CgkvL9Cf0L7Qv9GA0L7QsdGD0Y4g0LLRi9C30LLQsNGC0YwKCXd3LnBydCgpOwoJLy/QnNC10YLQvtC0INCy0YvQt9GL0LLQsNC10YLRgdGPLCDQvdC+INC/0L4g0YPQutCw0LfQsNGC0LXQu9GOIHRoaXMg0LIg0LzQtdGC0L7QtNC1INC80YPRgdC+0YAKCgoJdXNpbmcgZnVuMj12b2lkKCopKHZvaWQqKTsvL9Cf0L7Qv9GA0L7QsdGD0Y4g0YLQsNC6ICjQvNC10YLQvtC00Ysg0LLRgNC+0LTQtSDQutCw0Log0L/RgNC40L3QuNC80LDRjiDRg9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDRgdGC0YDRg9C60YLRg9GA0YMg0L/QtdGA0LLRi9C8INCw0YDQs9GD0LzQtdC90YLQvtC8KQoJdW5pb257Cgl2b2lkKiBhWzFdOwoJZnVuMiBwcnQ7Cgl9IHFxOwoJcXEuYVswXT10LmFbMF07CglxcS5wcnQoKHZvaWQqKTEyM3UpOy8v0KDQsNCx0L7RgtCw0LXRggoKCgoKCglyZXR1cm4gMDsKfQo=