C++ member함수 포인터 변환...

jic5760의 이미지

int clsName::cfunc()
{
....
}
 
void clsName::xxxx()
{
	void *pv = (void*)cfunc;
	int (clsName::*pf)() = pv;
	aaaa = pv();
}

뭐 이런식으로 하고 싶습니다.
그런데 잘 안되네요....ㅠㅠ
union으로 C++ 멤버함수포인터, void* 포인터 을 함께 넣어놓고 해봐도 잘 안되구...ㅜㅜ

union {
	int (clsName::*memberfunc)();
	void *pvoidptr;
} tpf;
tpf.memberfunc = &clsName::cfunc;
tpf.memberfunc(); //이것 안됨...
this->*(tpf.memberfunc)(); //이런것도 안됨..ㅠㅠ

어떻게 해야 할까요??

void*으로 변환하는 이유는 함수포인터를 uintptr_t (unsigned integer형식) 으로 바꾸기 위함입니다.

kukyakya의 이미지

static이 아닌 멤버 함수의 경우 함수 포인터를 void*로 변환하실 수 없습니다.

이는 멤버함수 포인터의 구현방식 때문인데, 구현에 따라 다르지만 보통 멤버함수포인터에는 함수포인터와 클래스정보까지 담기기 때문입니다.

멤버함수 포인터는 그냥 T::*pf 형식 그대로 저장하셨다가 꺼내 쓰셔야합니다.

굳이 멤버함수포인터를 uintptr_t로 변경하셔야하는 이유가 있으신가요?

jic5760의 이미지

uintptr_t 으로 해서 포인터를 다른 곳에 있는 함수로 보내서 호출할 수 있게 하려고 했었습니다.
결국 안되나 보네요..ㅜㅜ

klara의 이미지

다른 곳에 있는 함수로 보내서 호출할 수 있게 하려는데 왜 uintptr_t를 써야하나요?
구현상의 제약이 있는 건가요?
좀더 구체적인 질문을 하시면 대안책도 답변받을 수 있을거 같습니다.

jic5760의 이미지

각각다른 함수들을 배열에 저장시켜 놓고 필요할 때 호출하기 위함이었습니다.
결국 static으로 해결했습니다.
감사합니다~ㅎ