
#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;
}
