C++ member함수 포인터 변환...
글쓴이: jic5760 / 작성시간: 목, 2014/12/18 - 7:52오후
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형식) 으로 바꾸기 위함입니다.
Forums:
static이 아닌 멤버 함수의 경우 함수 포인터를
static이 아닌 멤버 함수의 경우 함수 포인터를 void*로 변환하실 수 없습니다.
이는 멤버함수 포인터의 구현방식 때문인데, 구현에 따라 다르지만 보통 멤버함수포인터에는 함수포인터와 클래스정보까지 담기기 때문입니다.
멤버함수 포인터는 그냥 T::*pf 형식 그대로 저장하셨다가 꺼내 쓰셔야합니다.
굳이 멤버함수포인터를 uintptr_t로 변경하셔야하는 이유가 있으신가요?
전달...
uintptr_t 으로 해서 포인터를 다른 곳에 있는 함수로 보내서 호출할 수 있게 하려고 했었습니다.
결국 안되나 보네요..ㅜㅜ
다른 곳에 있는 함수로 보내서 호출할 수 있게
다른 곳에 있는 함수로 보내서 호출할 수 있게 하려는데 왜 uintptr_t를 써야하나요?
구현상의 제약이 있는 건가요?
좀더 구체적인 질문을 하시면 대안책도 답변받을 수 있을거 같습니다.
해결했습니다.
각각다른 함수들을 배열에 저장시켜 놓고 필요할 때 호출하기 위함이었습니다.
결국 static으로 해결했습니다.
감사합니다~ㅎ
댓글 달기