Я хочу создать строку со встроенной информацией. Один из способов (не единственный) достижения того, что я хочу, называется интерполяцией строк или подстановкой переменных, при этом заполнители в строке заменяются фактическими значениями.
В 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;
Я не хочу печатать строку в стандартный вывод. Я хочу передать std::string
в качестве аргумента функции (например, конструктору объекта исключения).
- Я использую С++ 11, но переносимость потенциально проблематична, поэтому знание того, какие методы работают, а какие нет, в каких версиях С++, было бы плюсом.
Изменить
Для моего непосредственного использования я не беспокоюсь о производительности (я делаю исключение, чтобы кричать вслух!). Однако в целом было бы очень полезно знать относительную производительность различных методов.
Почему бы просто не использовать сам printf (в конце концов, C++ — надмножество C...)? В этом ответе обсуждаются некоторые причины, почему нет. Насколько я понимаю, безопасность типов является серьезной причиной: если вы поместите %d, переменная, которую вы туда поместите, должна действительно быть конвертируемой в целое число, поскольку именно так функция определяет, какой это тип. Было бы намного безопаснее иметь метод, который использует знания времени компиляции о фактическом типе вставляемых переменных.
printf
илиfprintf(std::cout, ...
вc++
? - person Fantastic Mr Fox   schedule 22.06.2016%d
этоint
, а неdouble
. - person T.C.   schedule 15.11.2016