fork download
  1.  
  2. #include <stdio.h>
  3.  
  4.  
  5. void te1(){
  6. printf("te1 %llu\n",te1);
  7. }
  8.  
  9. struct A{
  10. static void te2(){
  11. printf("te2 %llu\n",te2);
  12. }
  13.  
  14. void te3(){
  15. printf("te3 %llu\n",this);
  16. }
  17. static void te4(){
  18. printf("te2 %llu\n",te2);
  19. }
  20.  
  21. };
  22.  
  23. int main(void)
  24. {
  25. A a;
  26. printf("%llu %llu %llu\n",sizeof(&te1),sizeof(&A::te2),sizeof(&A::te3));
  27. //Проблема начинается с того, что размер указателя на метод - 16,
  28. //вместо 8 для обычного указателя на функцию или статический
  29.  
  30.  
  31. using fun=void(*)(void);
  32. typedef void(A::* met)(void); //Я не знаю как это через using записывается
  33. union{
  34. void* a[2];
  35. met prt;
  36. } t;
  37. t.prt=&A::te3;
  38. printf("union %llu %llu\n",t.a[0],t.a[1]);
  39. //В первой ячейке адрес, во второй 0.
  40.  
  41. printf("&a:%llu te2:%llu te4:%llu\n",&a,&A::te2,&A::te4);
  42. //Адерс te3 где-то между te2 и te4
  43. //Ну - у меня на компьютере, на ideone уже по другому - но всё-равно рядом
  44.  
  45. union{
  46. void* a[1];
  47. fun prt;
  48. } ww;
  49. ww.a[0]=t.a[0];
  50. //Попробую вызвать
  51. ww.prt();
  52. //Метод вызывается, но по указателю this в методе мусор
  53.  
  54.  
  55. using fun2=void(*)(void*);//Попробую так (методы вроде как принимаю указатель на структуру первым аргументом)
  56. union{
  57. void* a[1];
  58. fun2 prt;
  59. } qq;
  60. qq.a[0]=t.a[0];
  61. qq.prt((void*)123u);//Работает
  62.  
  63.  
  64.  
  65.  
  66.  
  67. return 0;
  68. }
  69.  
Success #stdin #stdout 0s 4472KB
stdin
Standard input is empty
stdout
8 8 16
union 4198848 0
&a:140724195777328 te2:4198864 te4:4198896
te3 0
te3 123