Para uma classe, desejo armazenar alguns ponteiros de função para funções-membro da mesma classe em um objeto de map
armazenamento std::function
. Mas eu falhei logo no começo com este código:
class Foo {
public:
void doSomething() {}
void bindFunction() {
// ERROR
std::function<void(void)> f = &Foo::doSomething;
}
};
Eu recebo error C2064: term does not evaluate to a function taking 0 arguments
em xxcallobj
combinado com alguns erros modelo instanciação estranhas. Atualmente, estou trabalhando no Windows 8 com o Visual Studio 2010/2011 e no Win 7 com o VS10, também falha. O erro deve ser baseado em algumas regras C ++ estranhas que eu não sigo
std::function
, com extrasthis
como é primeiro parâmetro, comostd::function<void(Foo*, int, int)> = &Foo::doSomethingArgs
Ou você precisa
para que você possa chamá-lo em qualquer instância ou precisar vincular uma instância específica, por exemplo
this
fonte
this
?Se você precisar armazenar uma função de membro sem a instância da classe, poderá fazer algo assim:
Como seria o tipo de armazenamento sem auto ? Algo assim:
Você também pode passar esse armazenamento de função para uma ligação de função padrão
Notas passadas e futuras: Uma interface antiga std :: mem_func existia, mas foi descontinuada. Existe uma proposta, pós-C ++ 17, para tornar o ponteiro para funções-membro que pode ser chamado . Isso seria muito bem-vindo.
fonte
std::mem_fn
foi removido; um monte de sobrecargas desnecessárias foram. Por outro lado, foi preterido no C ++ 11 e será removido no C ++ 17.std::mem_fun
template<class R, class T> unspecified mem_fn(R T::*);
e não vai desaparecer.Infelizmente, o C ++ não permite que você obtenha diretamente um objeto que pode ser chamado referente a um objeto e a uma de suas funções membro.
&Foo::doSomething
fornece um "ponteiro para a função de membro" que se refere à função de membro, mas não ao objeto associado.Há duas maneiras de contornar isso: uma é usar
std::bind
para vincular o "ponteiro à função de membro" aothis
ponteiro. O outro é usar um lambda que captura othis
ponteiro e chama a função de membro.Eu preferiria o último.
Com o g ++, pelo menos, vincular uma função de membro a isso resultará em um objeto com três ponteiros de tamanho, atribuir isso a um
std::function
resultará em alocação dinâmica de memória.Por outro lado, um lambda que captura
this
é apenas um ponteiro em tamanho, atribuí-lo a umstd::function
não resultará em alocação dinâmica de memória com g ++.Embora eu não tenha verificado isso com outros compiladores, suspeito que resultados semelhantes serão encontrados lá.
fonte
Você pode usar functors se desejar um controle menos genérico e mais preciso sob o capô. Exemplo com minha API do win32 para encaminhar a mensagem da API de uma classe para outra classe.
IListener.h
Listener.h
Dispatcher.h
Princípios de uso
Boa sorte e obrigado a todos por compartilhar conhecimento.
fonte
Você pode evitar
std::bind
fazer isso:fonte