Clase de plantilla de C++ que crea instancias de otras clases
Frecuentes
Visto 190 veces
0
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.
2 Respuestas
4
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
2
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 c++ templates or haz tu propia pregunta.
cual seria el regreso tipo de esta función mítica ser? ¿Cómo usarías esto? - Kerrek SB
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? - Konrad Rudolph
Es casi seguro que se trata de un problema XY. ¿Puede describir el problema real que está tratando de resolver? - Kerrek SB
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é. - domlao
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. - pmr