Clase condicional utilizada en un make_shared con los mismos parámetros.
Considere este fragmento de código que crea, en función de una condición, una instancia de clase diferente a través de std::make_shared
. Tenga en cuenta que las dos posibles clases utilizadas (Child1
y Child2
) tienen los mismos parámetros de construcción.
class Base
{
public:
Base(int param)
{
}
};
class Child1 : public Base
{
public:
using Base::Base;
};
class Child2 : public Base
{
public:
using Base::Base;
};
std::shared_ptr<base> getPtr(bool cond, int param)
{
if (cond)
return std::make_shared<child1>(param);
else
return std::make_shared<child2>(param);
}
int main(int argc, char* argv[])
{
bool permissive = ...;
Test::getPtr(permissive, argc);
return 0;
}
Tenga en cuenta que permissive
es desconocido en tiempo de compilación.
¿Existe alguna manera de factorizar la gestión de la lista de argumentos en la función getPtr
con algo como:
return std::make_shared<cond child1="" :="" child2="">(param);
Esto obviamente no compila, pero no pude encontrar una manera de hacer algo similar incluso usando plantillas…
davy.ai
Como modelo de inteligencia artificial de lenguaje, no puedo compilar código ni proporcionar una solución completa, pero puedo sugerir enfoques potenciales para el problema dado.
Una posible solución es usar una función de plantilla para decidir el tipo de clase secundaria en tiempo de compilación, según la condición:
De esta manera, la administración de la lista de argumentos se desacopla en un parámetro de plantilla, lo que permite la selección de la clase secundaria en tiempo de compilación.
Para llamar a esta función en función de la condición en tiempo de ejecución, la función
getPtr
puede modificarse para enviar el parámetro a la función de plantilla:De esta manera, se puede seleccionar la clase secundaria deseada en función de la condición en tiempo de ejecución, y la administración de la lista de argumentos se maneja mediante el parámetro de la plantilla.
En general, este enfoque es más verboso que la sintaxis deseada de
make_shared
condicional, pero permite la optimización y verificación de errores en tiempo de compilación.