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()
?
davy.ai
Una posible solución es crear un tipo personalizado para
FirstName
ySecondName
que se derive destd::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 argumentoss
yf
. Este error se produce sin cambiar nada enDoSmth()
.