Clase de plantilla de C++ que crea instancias de otras clases

Soy nuevo en C ++ y no sé acerca de la clase de plantilla, pero creo que puedo usar la plantilla para mi problema. tengo dos clases

class Foo
{
 public:
    Foo (int a, char b);
};

class Bar
{
 public:
    Bar (int a);
};

Y estas clases no están relacionadas entre sí.

Mi pregunta es, ¿es posible crear una clase de plantilla para crear instancias de Foo y Bar? Algo que se podría usar así:

TemplateClass<Foo>::createClass();

Pero no estoy seguro sobre el parámetro.

preguntado el 24 de agosto de 12 a las 08:08

cual seria el regreso tipo de esta función mítica ser? ¿Cómo usarías esto? -

Además de lo que dijo Kerrek: el porqué ¿Te gustaría tener una función así? Si las clases no están relacionadas, ¿por qué tener una función común para crear instancias? ¿Qué parámetros quieres pasar a los constructores? -

Es casi seguro que se trata de un problema XY. ¿Puede describir el problema real que está tratando de resolver? -

el método createClass es un método estático de TemplateClass que devolverá la clase como Foo o Bar. En realidad, no estoy seguro de lo que estoy haciendo, solo lo pensé. -

Tener la capacidad de elevar la construcción de objetos a un funtor puede ser bastante útil. Por eso cosas como Boost.Fábrica existe. -

2 Respuestas

Puede usar C++ 11 para esto.

template<typename T>
class TemplateClass
{
public:
   template<class... Args>
   static T createClass(Args&&... args)
   {
      return T(std::forward<Args>(args)...);
   }
};

Foo f = TemplateClass<Foo>::createClass(1, '1');
Bar b = TemplateClass<Bar>::createClass(1);

O con C++03 use diferentes sobrecargas.

template<typename T>
class TemplateClass
{
public:
   static T createClass()
   {
      return T();
   }
   template<typename Arg1>
   static T createClass(const Arg1& arg)
   {
      return T(arg);
   }
   template<typename Arg1, typename Arg2>
   static T createClass(const Arg1& arg1, const Arg2& arg2)
   {
      return T(arg1, arg2);
   }
};

Y así sucesivamente ...

Respondido 24 ago 12, 09:08

¿Qué son las diferentes sobrecargas? Gracias. - domlao

Agradable. Excelente. Creo que esta es la solución. Esperando 1 minuto para aceptar. =) ¡Muchas gracias! - domlao

Los constructores no son funciones normales y, por lo tanto, no se pueden usar con bind u otros mecanismos funcionales fácilmente. Escribir un envoltorio con funcionalidad limitada es fácil con C++11 como muestra ForEver, pero esto puede volverse complicado sin C++11 y cuando necesita más que la funcionalidad básica. Puedes usar Boost.Fábrica para eso.

Respondido 24 ago 12, 09:08

Desafortunadamente, no puedo usar la biblioteca Boost en mi código. ¡Muchas gracias! Lo consideraré en el futuro cambio del diseño. - domlao

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.