Pergunta

Eu tenho uma classe de modelo definido (em parte) como

template <class T> MyClass
{
public:
   void DoSomething(){}
};

Se eu quiser chamar DoSomething de outra classe, mas ser capaz de fazer isso para vários tipos de 'T' no mesmo lugar, eu estou preso por uma idéia como método funciona ponteiros são restritos exclusivamente para o tipo de classe. Claro, cada MyClass é um tipo diferente, então eu não pode armazenar ponteiros de função para MyClassDoSomething () de uma forma 'polimórfica'.

Meu caso de uso é que eu quero armazenar, em uma classe de exploração, um vetor de ponteiros de função para 'DoSomething' tal que eu posso emitir uma chamada para todas as classes armazenadas de um lugar.

Alguém tem alguma sugestão?

Foi útil?

Solução

Ok, então a solução functor não funcionar como você precisa. Talvez você deve ter sua classe herde modelo a partir de uma base comum de classe "Interface". E então você usa um vetor daqueles.

Algo parecido com isto:

class Base { 
public:
  virtual ~Base(){}
  virtual void DoSomething() = 0;
}

template <class T> class MyClass : public Base {
public:
    void DoSomething(){}
};

std::vector<Base *> objects;
objects.push_back(new MyClass<int>);
objects.push_back(new MyClass<char>);

Outras dicas

Você sabe, isso é exatamente o que eu precisava fazer. Bizzarly eu tinha descontado-lo como uma solução válida para o meu usecase cedo, por razões que agora me escapam. Eu acho que eu estava cego por algumas coisas metaprogramming que eu estou fazendo no mesmo lugar para expedição em tempo de compilação (ou seja, confundindo tempo de compilação e tempo de execução no meu cérebro podre).

Obrigado por os solavancos!

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