Я хочу создать строку со встроенной информацией. Один из способов (не единственный способ) достижения того, что я хочу, называется строковая интерполяция или подстановка переменных, где заполнители в строке заменяются фактическими значениями.
В C я бы сделал что-то вроде этого:
printf("error! value was %d but I expected %d",actualValue,expectedValue)
тогда как если бы я программировал в python, я бы сделал что-то вроде этого:
"error! value was {0} but I expected {1}".format(actualValue,expectedValue)
оба являются примерами строковой интерполяции.
Как это сделать в С++?
Важные предостережения:
- Я знаю, что я могу использовать
std::cout
, если я хочу напечатать такое сообщение на стандартный вывод (а не на строку интерполяции, но распечатывает нужный тип строки):
cout << "error! value was " << actualValue << " but I expected "
<< expectedValue;
Я не хочу печатать строку в stdout. Я хочу передать std::string
в качестве аргумента функции (например, конструктор объекта исключения).
- Я использую С++ 11, но переносимость потенциально является проблемой, поэтому знание того, какие методы работают и не работают, в каких версиях С++ будет плюсом.
Edit
-
Для моего непосредственного использования меня не интересует производительность (я поднимаю исключение для крика вслух!). Однако знание относительной производительности различных методов было бы очень полезно в целом.
-
Почему бы просто не использовать printf (С++ - это супермножество C в конце концов...)? В этом ответе обсуждаются некоторые причины, почему нет. Насколько я понимаю, тип безопасности - это большая причина: если вы положили% d, переменная, которую вы ввели, лучше всего была бы конвертируемой в целое число, так как функция определяет, какой тип она есть. Было бы гораздо безопаснее иметь метод, который использует знание времени компиляции фактического типа переменных, которые нужно вставить.