Pregunta

Tengo una clase de plantilla definida (en parte) como

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

Si quiero llamar a DoSomething desde otra clase, pero ser capaz de hacer esto para varios tipos 'T' en el mismo lugar, me quedo atascado en una idea, ya que los punteros de las funciones del método están limitados de forma única al tipo de clase. Por supuesto, cada MyClass es un tipo diferente, por lo que no puedo almacenar los punteros de función a MyClassDoSomething () de una manera 'polimórfica'.

Mi caso de uso es que quiero almacenar, en una clase de espera, un vector de punteros de función a 'DoSomething' para que pueda emitir una llamada a todas las clases almacenadas desde un lugar.

¿Alguien tiene alguna sugerencia?

¿Fue útil?

Solución

Ok, entonces la solución de funtor no funciona como usted lo necesita. Quizás debería tener su clase de plantilla heredada de una base común " Interfaz " clase. Y luego usas un vector de esos.

Algo como esto:

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>);

Otros consejos

Sabes, eso es justo lo que necesitaba hacer. Bizzarly lo había descontado como una solución válida para mi caso de uso desde el principio, por razones que ahora se me escapan. Creo que me quedé cegado por algunas cosas de metaprogramación que estoy haciendo en el mismo lugar para el envío en tiempo de compilación (es decir, confuso tiempo de compilación y tiempo de ejecución en mi cerebro confundido).

¡Gracias por las sacudidas!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top