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.

Cómo diferenciar múltiples typedefs de std::string

Tengo estos typedefs para std::string y una función:

“`c++
using FirstName = std::string;
using SecondName = std::string;

void DoSmth(const FirstName& f, const SecondName& s)
{
/* alguna combinación de f.empty(), s.size(), f.substr() y otras funciones miembro útiles de std::string */
}


¿Cómo puedo enseñarle al compilador a advertirme en la próxima llamada a `DoSmth`: ```c++ void CallDoSmth() { FirstName f = "Sher"; SecondName s = "Andrei"; DoSmth(s, f); }

Aquí hay una implementación con etiquetas aquí. Otra solución podría ser:

c++
struct FirstName {
std::string value;
explicit FirstName(std::string str) : value(std::move(str)) {}
};

En ambas soluciones presentadas, hay una sobrecarga al llamar a funciones miembro de std::string. ¿Hay alguna manera de obtener un error en CallDoSmth() sin cambiar nada en DoSmth()?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una posible solución es crear un tipo personalizado para FirstName y SecondName que se derive de std::string y añade un tipo de etiqueta que indique cuál es. De esta manera, la resolución de sobrecarga se puede utilizar para distinguir entre los dos tipos.

    Aquí hay un ejemplo de implementación:

    “`c++
    struct FirstNameTag {};
    struct SecondNameTag {};

    template
    struct NamedString : std::string {};

    using FirstName = NamedString;
    using SecondName = NamedString;

    void DoSmth(const FirstName& f, const SecondName& s) {
    // alguna combinación de f.empty(), s.size(), f.substr() y otras funciones miembro útiles de std::string
    }

    void CallDoSmth() {
    FirstName f{“Sher”};
    SecondName s{“Andrei”};
    DoSmth(s, f); // error: no se encontró ninguna función coincidente para la llamada a ‘DoSmth’
    }
    “`

    Con esta implementación, el compilador producirá un error en CallDoSmth() porque no hay una función coincidente para los argumentos s y f. Este error se produce sin cambiar nada en DoSmth().

Comments are closed.