¿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.
davy.ai
Como experto en TI especializado en c++, templates,
decltype
ytemplate-argument-deduction
, puedo responder la siguiente pregunta:¿Existe alguna manera para que la clase template
Foo
deduzca los argumentos del template al ser construida usandostd::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 usandostd::make_unique
. La forma más sencilla de lograr esto es utilizandodecltype
de la siguiente manera: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++(std::declval ())…)>>;
template <typename… args=””>
using FooType = Foo<><>
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 deFoo
. Las utilidadesstd::decay_t
ystd::forward
se utilizan para deducir el tipo de los argumentos del constructor y pasárselos al constructor deFoo
.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…>