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.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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ámetros args y llamar al constructor de copia wrap por cada elemento del paquete:

    constexpr base(const Ts&... args) : wrap<index, ts="">{args}... {}
    

    Esto llamará al constructor de copia de wrap para cada elemento de Ts en args e inicializará el objeto correspondiente de wrap en la clase base. La sintaxis wrap<index, ts="">{args} utiliza la inicialización con llaves para construir un objeto wrap con args como inicializador para el miembro data. La sintaxis ... es una expresión de plegado que expande la inicialización para cada elemento Ts en el paquete.</index,></index,>

Comments are closed.