es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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…

Tags:  , , ,

Answer

  1. Avatar for 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:

    template<bool cond="">
    std::shared_ptr<base> getPtr(int param) {
        if constexpr (Cond)
            return std::make_shared<child1>(param);
        else
            return std::make_shared<child2>(param);
    }
    

    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:

    std::shared_ptr<base> getPtr(bool cond, int param) {
        if (cond)
            return getPtr<true>(param);
        else
            return getPtr<false>(param);
    }
    

    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.

Comments are closed.