C ++ имеет правильные строки, так что вы можете использовать их. Они в стандартной строке заголовка. #include чтобы использовать их. Больше нет переполнений буфера strcat / strcpy; больше нет пропущенных нулевых терминаторов; нет больше грязного ручного управления памятью; строки с правильным подсчетом и семантикой правильного значения.
C ++ имеет возможность конвертировать bools в удобочитаемые представления. Мы видели намеки на это ранее с примерами iostream, но они немного ограничены, потому что они могут только переносить текст на консоль (или с помощью fstreams, файла). К счастью, разработчики C ++ не были полными идиотами; у нас также есть iostreams, которые поддерживаются не консолью или файлом, а автоматически управляемым строковым буфером. Их называют струнными потоками. #include чтобы получить их. Тогда мы можем сказать:
std::string bool_as_text(bool b)
{
std::stringstream converter;
converter << std::boolalpha << b; // flag boolalpha calls converter.setf(std::ios_base::boolalpha)
return converter.str();
}
Конечно, мы не хотим печатать все это. К счастью, в C ++ также есть удобная сторонняя библиотека с именем Boost , которая может помочь нам в этом. Boost имеет замечательную функцию lexical_cast. Мы можем использовать его таким образом:
boost::lexical_cast<std::string>(my_bool)
Теперь верно сказать, что это больше издержек, чем какой-то макрос; Строковые потоки имеют дело с локалями, которые могут вас не волновать, и создают динамическую строку (с выделением памяти), тогда как макрос может выдавать буквальную строку, что позволяет избежать этого. Но, с другой стороны, метод stringstream может использоваться для очень многих преобразований между печатными и внутренними представлениями. Вы можете запустить их в обратном направлении; Например, boost :: lexical_cast ("true") делает правильные вещи. Вы можете использовать их с числами и фактически любым типом с правильными отформатированными операторами ввода-вывода. Так что они довольно универсальны и полезны.
И если после всего этого ваши профилирование и бенчмаркинг обнаружат, что lexical_casts являются недопустимым узким местом, это , когда вам следует подумать о том, чтобы сделать какой-нибудь макро-ужас.