#include <string>
#include <locale>
std::string str = "Hello World!";
auto & f = std::use_facet<std::ctype<char>>(std::locale());
f.toupper(str.data(), str.data() + str.size());
Это будет работать лучше, чем все ответы, которые используют глобальную функцию toupper, и, вероятно, это то, что делает boost :: to_upper ниже.
Это потому, что :: toupper должен искать локаль - потому что она могла быть изменена другим потоком - для каждого вызова, тогда как здесь только штраф к вызову locale (). И поиск локали обычно включает взятие блокировки.
Это также работает с C ++ 98 после замены auto, использования нового неконстантного str.data () и добавления пробела для прерывания закрытия шаблона (от «>>» до «>>») как это:
std::use_facet<std::ctype<char> > & f =
std::use_facet<std::ctype<char> >(std::locale());
f.toupper(const_cast<char *>(str.data()), str.data() + str.size());