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.

Argumentos variádicos (va_arg) y su tipo por defecto

Cuando uso printf para imprimir una std::string en la pantalla, necesito usar "%s" y la función c_str(). Me gustaría crear una clase que herede de std::string y que por defecto devuelva el valor de c_str como se muestra en el ejemplo a continuación:

class String : public std::string
{
    public:

        using std::string::string;

        operator const char *() const
        {
            return c_str();
        }
};

...

String s = "abc";
printf("%s\n", abc);

No funcionará ya que operator const char *() no se aplica al tipo de ... que se utiliza en la función printf. ¿Alguna idea de cómo hacer esto? const void *' tampoco funciona.

Tags:  ,

Answer

  1. Avatar for davy.ai

    La solución a este problema es crear una función personalizada similar a printf que tome la clase String como argumento y utilice el operador sobrecargado operator const char *() para imprimirlo. Aquí tienes un ejemplo de cómo implementar dicha función:

    void my_printf(const char* formato, const String& str)
    {
        printf(formato, static_cast<const char*="">(str));
    }
    

    Con esta función, puedes imprimir un objeto String de la siguiente manera:

    String s = "abc";
    my_printf("%s\n", s);
    

    Esto llamará a la función operator const char *() de la clase String y pasará el puntero resultante const char * a printf, que lo imprimirá como se esperaba.

Comments are closed.