“la chaîne de l'interpolation” en C++: la Construction d'un std::string avec les valeurs intrinsèques (par exemple, pour les messages d'erreur)?

Je veux créer une chaîne avec des informations intégrées. Un moyen (pas la seule) de la réalisation de ce que je veux, c'est appelé chaîne d'interpolation ou la substitution de variable, où les espaces dans une chaîne de caractères sont remplacés par des valeurs réelles.

En C, je voudrais faire quelque chose comme ceci:

printf("error! value was %d but I expected %d",actualValue,expectedValue)

alors que si je ont été de programmation en python, je voudrais faire quelque chose comme ceci:

"error! value was {0} but I expected {1}".format(actualValue,expectedValue)

ces deux sont des exemples de chaîne d'interpolation.

Comment puis-je le faire en C++?

Mises En Garde Importantes:

  1. Je sais que je peux utiliser std::cout si je veux imprimer un message sur la sortie standard (pas de chaîne d'interpolation, mais affiche le type de chaîne que je veux):
cout << "error! value was " << actualValue << " but I expected "
<< expectedValue;

Je ne veux pas impression une chaîne de caractères sur la sortie standard stdout. Je veux passer un std::string comme argument à une fonction (par exemple, le constructeur d'un objet d'exception).

  1. Je suis à l'aide de C++11, mais la portabilité est potentiellement un problème, en connaissant les méthodes qui fonctionne et ne fonctionne pas dans les versions de C++ serait un plus.

Modifier

  1. Pour ma immédiat de l'usage, je ne suis pas préoccupé par la performance (je suis le déclenchement d'une exception pour cryin' out loud!). Cependant, sachant que la performance relative des différentes méthodes serait très très utile en général.
  2. Pourquoi ne pas simplement utiliser printf lui-même (C++ est un sur-ensemble de C, après tout...)? Cette réponse traite certaines raisons, pourquoi pas. Aussi loin que je peux comprendre, le type de sécurité est une grande raison: si vous placez %d, la variable que vous avez mis en il y avait de mieux vraiment être convertibles en un nombre entier, comme c'est la fonction des chiffres de quel type il est. Il serait beaucoup plus sûr d'avoir une méthode qui utilise au moment de la compilation de connaissances du type réel de l'variables à insérer.
c++ n'est toujours pas ont un niveau moyen de faire cela? Je suis surpris, il a réussi à obtenir les threads, mais pas un moderne printf
Qu'en est seulement à l'aide de printf ou fprintf(std::cout, ... dans c++?
Stroustrupp met ensemble un bel exemple de l'utilisation de variadic template avec des fonctions de type sécurisé printf. En fait je pense que c'est une bonne mise en œuvre.
c'est une excellente question. J'ai ajouté une note sur ce sujet.
Ceci est appelé la chaîne d'interpolation, par la manière.

OriginalL'auteur stochastic | 2016-06-21