Во-первых, если вы хотите вывести char
с (и все char
с), вы будете
нужно использовать ostreambuf_iterator<char>
, а не
ostream_iterator<string>
. И ostreambuf_iterator<char>
выражает
лучше, чем вы хотите, чем ostream_iterator<char>
; Вы
вывод char
s напрямую, ничего не форматируя.
(ostream_iterator
использует оператор <<
, который форматирует.)
Во-вторых, имейте в виду, что не всегда есть один к одному перевод
от нижнего к верхнему (например, 'ß'
соответствует последовательности из двух символов "SS"
в
верхний регистр), поэтому std::transform
не может использоваться для выполнения работы
правильно. (И, конечно, он не обрабатывает многобайтовые кодировки, такие как
UTF-8 правильно.) Для всего, кроме простейшего использования, вам нужно что-то
более сложный Но даже для самых простых случаев:
std::toupper
перегружен: одна из перегрузок является шаблоном, который
принимает два аргумента, а другой является функцией, которая принимает один
int
; ни тот, ни другой не будут работать напрямую, и тот факт, что transform
также шаблон означает, что разрешение перегрузки и тип шаблона
удержание не сработает, даже если они сработают. В общем, вы должны добавить
что-то. Можно использовать функцию шаблона с двумя аргументами, если вы
добавьте достаточно квалификаторов и используйте boost::bind
или что-то похожее на связывание
второй аргумент, но это почти столько же текста, сколько написание простого
toupper
функциональный аргумент сам. И вы не можете использовать сингл
форма аргумента (к которой можно однозначно получить доступ, если включить
<ctype.h>
и используйте ::toupper
), потому что он имеет неопределенное поведение, если
вы используете char
в качестве аргумента при вызове: вы должны преобразовать
сначала от char
до unsigned char
(если, конечно, обычный char
не является
без знака в используемой реализации & mdash; и во всех
реализации, в которые ваш код будет портирован).