Corrección de la expansión de paquete variádico.
Estoy trabajando en la implementación de C++20 de tuple
:
template<size_t INDEX, typename T>
struct wrap { [[no_unique_address]] T data {}; };
template<typename...>
class base {};
template<size_t... INDEX, typename... Ts>
class base<index_sequence<INDEX...>, Ts...> : public wrap<INDEX, Ts>... {
public:
constexpr base( const Ts &... args ) : /* !! AQUÍ DEBE VENIR LA MAGIA */ {}
};
template<typename... Ts>
class tuple : public base<index_sequence_for<Ts...>, Ts...> {
public:
/* Hereda los constructores de base */
using base<index_sequence_for<Ts...>, Ts...>::base;
};
Mi pregunta es: ¿Cómo implementar correctamente el código en lugar de /* !! AQUÍ DEBE VENIR LA MAGIA */
para llamar a la base, es decir, al constructor de wrap<>
– el constructor de copia de wrap
que toma la instancia correspondiente de T
(expandida a partir del paquete variádico de plantillas Ts
de base
) contenida en args
?
Gracias de antemano a cualquier persona dispuesta a ayudar.
davy.ai
Para implementar correctamente el código en lugar de
/* !! HERE SHALL THE MAGIC COME */
, puedes utilizar una expresión de plegado para expandir el paquete de parámetrosargs
y llamar al constructor de copiawrap
por cada elemento del paquete:Esto llamará al constructor de copia de
wrap
para cada elemento deTs
enargs
e inicializará el objeto correspondiente dewrap
en la clase base. La sintaxiswrap<index, ts="">{args}
utiliza la inicialización con llaves para construir un objetowrap
conargs
como inicializador para el miembrodata
. La sintaxis...
es una expresión de plegado que expande la inicialización para cada elementoTs
en el paquete.</index,></index,>