Question rapide probablement évidente.
Si j'ai:
void print(string input)
{
cout << input << endl;
}
Comment puis-je l'appeler ainsi:
print("Yo!");
Il se plaint que je passe en char *, au lieu de std :: string. Existe-t-il un moyen de le transtyper dans l'appel? Au lieu de:
string send = "Yo!";
print(send);
Merci.
Vous pouvez écrire votre fonction pour prendre un const std::string&
:
void print(const std::string& input)
{
cout << input << endl;
}
ou un const char*
:
void print(const char* input)
{
cout << input << endl;
}
Les deux façons vous permettent de l'appeler comme ceci:
print("Hello World!\n"); // A temporary is made
std::string someString = //...
print(someString); // No temporary is made
La deuxième version nécessite que c_str()
soit appelée pour std::string
S:
print("Hello World!\n"); // No temporary is made
std::string someString = //...
print(someString.c_str()); // No temporary is made
Vous devriez pouvoir appeler print ("yo!") Car il existe un constructeur pour std :: string qui prend un caractère const *. Ces constructeurs à argument unique définissent des conversions implicites de leurs aguments vers leur type de classe (sauf si le constructeur est déclaré explicite, ce qui n'est pas le cas pour std :: string). Avez-vous réellement essayé de compiler ce code?
void print(std::string input)
{
cout << input << endl;
}
int main()
{
print("yo");
}
Il compile bien pour moi dans GCC. Cependant, si vous déclarez print comme ceci void print(std::string& input)
alors il ne pourra pas être compilé car vous ne pouvez pas lier une référence non const à un temporaire (la chaîne serait un temporaire construit à partir de "yo")
Eh bien, std::string
Est une classe, const char *
Est un pointeur. Ce sont deux choses différentes. Il est facile de passer de string
à un pointeur (car il en contient généralement un qu'il peut simplement renvoyer), mais dans l'autre sens, vous devez créer un objet de type std::string
.
Ma recommandation: les fonctions qui prennent des chaînes constantes et ne les modifient pas devraient toujours prendre const char *
Comme argument. De cette façon, ils fonctionneront toujours - avec des littéraux de chaîne aussi bien qu'avec std::string
(Via une c_str()
) implicite.
print(string ("Yo!"));
Vous devez faire un (temporaire) std::string
objet hors de lui.
La façon la plus évidente serait d'appeler la fonction comme ceci
print(string("Yo!"));
Faites en sorte que votre fonction accepte un const std::string&
Au lieu d'une sous-valeur. Non seulement cela évite la copie et est donc toujours préférable lors de l'acceptation de chaînes dans des fonctions, mais cela permet également au compilateur de construire un std::string
Temporaire à partir du char[]
Qui vous le donnez. :)
Il suffit de le convertir en un caractère const *. print ((const char *) "Yo!") fonctionnera très bien.