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.

¿Cómo puede la plantilla de clase deducir el tipo al construir una instancia con std::make_unique?

Supongamos que tenemos una plantilla de clase llamada Foo, la cual tiene un parámetro de plantilla de tipo que puede deducirse a partir de un argumento en su constructor. Si utilizamos std::make_unique para construir una instancia de Foo, ¿existe alguna forma de que el constructor de Foo deduzca los argumentos de la plantilla de la misma manera que lo haría si se llamara normalmente a su constructor? ¿Es esta la forma más sencilla de lograr esto?

std::make_unique< decltype(Foo{...}) > (...);

Esto parece bastante limpio, pero si el constructor de Foo recibe muchos argumentos, puede convertirse en una línea bastante fea.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en c++, templates, decltype y template-argument-deduction, puedo responder la siguiente pregunta:

    ¿Existe alguna manera para que la clase template Foo deduzca los argumentos del template al ser construida usando std::make_unique?

    Sí, es posible tener una clase template Foo que pueda deducir su argumento del template a partir de los argumentos de su constructor al ser construida usando std::make_unique. La forma más sencilla de lograr esto es utilizando decltype de la siguiente manera:

    std::make_unique< decltype(Foo{...}) > (...);
    

    Sin embargo, si el constructor de Foo toma muchos argumentos, esto puede resultar en una línea de código poco legible. Como alternativa, podemos utilizar un alias de template para simplificar la firma:

    “`c++
    template <typename… args=””>
    using FooType = Foo<><>(std::declval())…)>>;

    std::make_unique<footype<…>>(…);
    “`

    Este enfoque utiliza la deducción de argumentos de template para determinar el tipo del parámetro del template en función de los argumentos del constructor. Implica crear un alias de template FooType que toma los argumentos del constructor como sus parámetros de template y determina el tipo del parámetro del template de Foo. Las utilidades std::decay_t y std::forward se utilizan para deducir el tipo de los argumentos del constructor y pasárselos al constructor de Foo.

    En general, aunque el enfoque con decltype es más conciso, el enfoque con un alias de template es más legible y mantenible cuando se trata de un gran número de argumentos del constructor.</footype<…></typename…>

Comments are closed.