Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Brain_Storm

Ponteiros para funções

Recommended Posts

Olá pessoal, estou com uma dúvida interessante, mas que infelizmente não obtive sucesso em solucioná-la pelos meios rápidos como google e referências ^^

Eu estou criando uma série de classes pra ajudar no uso da SDL com C++, inspirado pela pygame de python. Acontece que é meio que um projeto pra aprendizado, nada muito sólido, e eu estou precisando do seguinte comportamento, por exemplo:

 

onKeyPressed(SDLK_ESCAPE,Game::quit);

 

Duas "brigas" acontecem aqui, a primeira é que não consigo passar uma função membro como parâmetro sem erros de invalid conversion.

A segunda é que eu desejaria por exemplo, chamar essa onKeyPressed varias vezes, e armazenar as funções pra serem executadas no imediato ocorrer do evento, OnMove(updateSomething); onMove(changeSomething); e tudo ocorrer em ordem quando o objeto for movido, a única ajuda que desejo é em relação a lidar com ponteiros para funções membros ou não membros, colocá-las em maps, etc, etc, e poder usá-los (os ponteiros) depois pra executar as funções, e não tenho a minima ideia de como fazer, mesmo com funções normais como int(*)(void), ainda mais com algo generalizado, pra que o trabalho por parte do programador seja apenas OnEvent(function,parameters); =]

 

Isso é o que eu tenho até agora (nada xD ):

void(*_onKeyPress)();

...

template<typename T>
T(*Game::onKeyPress(char c,T(*f)()))()
{
	_onKeyPress=f;

	map<const char,int(*)()>::iterator i = keyEvents.find(c);
	keyEvents.insert(i,f);

	return _onKeyPress;
}

...

 

void Game::run()
{
	onKeyPress<void>(SDLK_ESCAPE,Game::quit);
	while(true)
	{
		processEvents();
		flipScreen();
	}
}

 

Qualquer coisa é bem vinda, inclusive minha ultima alternativa que tentei ( estou tentando ), boost::functions. Qualquer coisa que possa ter o comportamento que eu falei no começo na interface.

 

Obrigado desde já. ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ahh.. eu consegui fazer uma função conversora que funciona legal... não to com source aqui mas acho que me lembro.

 

template<typename S, typename D>
D __fastcall _getAddress(S f)
{
    int addr;
    __asm { mov addr,ecx }
    return reinterpret_cast<D>(addr);
}

 

o call poderia ser por exemplo:

 

recebeNonMemberf(_getAddress<void(class::*)(),void(*)()>(&class::memberf));

Espero que ajude alguem =]

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.