Pergunta

Eu tenho uma classe que usa functors como unidades de trabalho. Ele aceita uma referência a um functor em seu método run (). Para permitir que essa classe para operar em qualquer functor, todas estas functors deve derivar de minha classe functor de base que tem esta aparência:

class baseFunctor{

public:
    virtual void operator()()=0;
    virtual baseFunctor Clone()=0;
};

Isso funciona, no entanto, obviamente, que restringe estes functors a ter um método operador que retorna void e não aceita parâmetros. Eu preciso ser capaz de aceitar um functor na minha classe que pode tomar qualquer tipo de parâmetros e retorno nada. Sua aparentemente capaz de fazer, mas eu não consigo encontrar uma maneira de fazê-lo. Eu tenho considerado usando modelos, herança múltipla, mas eu continuo recebendo frustrado pelo fato de que a classe que precisa ser executado este functor deve ser capaz de aceitar qualquer tipo, por isso vai aceitar o tipo de classe base, e assim não vai saber o tipo real do functor.

Todas as sugestões de que a avenida olhada seria apreciada.

Foi útil?

Solução

Como é que a classe que chama o know functor que parâmetros para fornecer e o que fazer com o valor de retorno, se houver?

Outras dicas

Então, se eu estou lendo esse direito, você tem um "padrão Visitor". Pode ser uma coisa boa para você olhar para cima.

Alguém precisa saber o que digite o functor é dar-lhe argumentos. Muitas vezes com functors, os argumentos são atribuídos aos campos da classe derivada e operador () irá operar nesses campos. Ou seja, o método mudo que chama o functor e não sabe nada sobre isso é dado o fechamento (método mais argumentos tudo em uma classe) por alguém mais experiente.

Se você quiser functors genéricos que tomam vários argumentos no operador (), modelagem vai te parcialmente lá, mas você vai precisar de um por arity.

Eu concordo com Neil. Sua classe principal tem de saber o que parâmetros para passar e qual o valor de retorno para esperar destes functors. Você pode simplesmente digitar-lançar o seu "functor" para uma classe apropriada que suporta a função com os argumentos necessários e valor de retorno?

class baseFunctor
{
};

class functor1x2: public baseFunctor
{
public:
    virtual void* execute(void*, void*);

}

class MainClass
{
public:
   void Execute(baseFunctor* ipFunctor)
   {
      functor1x2* lpFunctor1x2 = dynamic_cast<functor1x2*>(ipFunctor);
      if(lpFunctor1x2)
      {
         lpFunctor1x2->execute(NULL, NULL);
      }
   }
}

Eu não sei o que poderia ser conseguido com esta abordagem que não poderia mais facilmente ser realizado com o padrão Visitor, como Drew observou.

Se você está aberto a usar a biblioteca de impulso (www.boost.org), que você pode encontrar Boot.Bind e Boost.Function de interesse particular. Eu tenho usado no passado para conseguir algo muito ao longo das linhas do que você está discutindo.

Se você usar Boost.Bind, você pode executar currying nas functors para explicar as diferenças entre o número de argumentos espera functor eo número de argumentos espera método Run (ou seja, zero). O código que cria o functor teria que ligar quaisquer argumentos a valores específicos e, assim, criar um functor-argumento zero que pode ser passado para Run ().

MV

Por que você quer retornar o functor? Você está armazenando algum estado bem? Alguns mais detalhes será muito apreciado, uma vez que não é muito claro o que exatamente você quer fazer.

Se você pretende herança de uso, faça olhar para cima Tipos covariante de retorno (e Construtor Virtual idioma ).

Agora, para a carne do problema: o problema não é realmente com o passar em um functor mas com aplicação functor. Você pode querer dar uma olhada boost::lambda boost::parameter também.

Eu acho que você quer um argumento reticências, como varargs para C ++.

Talvez std :: tr1 :: função é interessante para você?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top