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.

Sobrescribir la declaración de un paquete de parámetros y los lugares de expansión.

Tengo un simple setter de interfaz:

template<typename interface="">
struct FrontEnd
{
  virtual void inject(Interface*& ptr, Client* client) = 0;
}

Quiero implementar estas interfaces mediante paquetes de parámetros de esta forma:

template<typename ...="" is="">
struct BackEnd : public FrontEnd<is>...
{
   void inject(Is*& ptr, Client* client) override
   {
      ptr = someStuff<is>.get(client);
   }
};

Sin embargo, esto falla con “parameter pack not expanded with ‘…’. No pude encontrar algo similar a esto en cppref. No tengo idea de dónde deberían ir los puntos de expansión (asumiendo que esto incluso sea legal, lo cual estoy inclinado a decir que no). ¿Alguna idea de cómo proporcionar redefiniciones para cada tipo en un paquete de parámetros?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para proporcionar anulaciones para cada tipo en un paquete de parámetros, puedes usar una expresión de pliegue junto con el operador de coma. Aquí tienes un ejemplo:

    template<typename ...="" is="">
    struct BackEnd : public FrontEnd<is>...
    {
       void inject(Is*& ptr, Client* client) override
       {
          ((ptr = someStuff<is>.get(client)), ...);
       }
    };
    

    La expresión de pliegue (expr, ...) aplica expr a cada elemento del paquete y los separa con el operador de coma, expandiendo efectivamente el paquete. En este caso, estamos usando el operador de coma para asignar el resultado de someStuff<is>.get(client) a ptr para cada tipo Is en el paquete.

    Ten en cuenta que esto requiere C++17, que has mencionado como una de tus áreas de experiencia.

Comments are closed.