![]() |
![]() ![]() ![]() ![]() |
![]() |
Boost "quoted" I/O manipulatorBoost , ,
|
|||||
"Quoted" Манипуляторы ввода/вывода для струн еще не приняты в Boost в качестве общедоступных компонентов. Таким образом, файл заголовка в настоящее время находится в |
C++ Стандартный библиотечный поток ввода/вывода для строк, содержащих встроенные пространства, может привести к неожиданным результатам. Например,
std::stringstream ss; std::string original = "fooled you"; std::string round_trip; ss << original; ss >> round_trip; std::cout << original; // outputs: fooled you std::cout << round_trip; // outputs: fooled assert(original == round_trip); // assert will fire
Манипулятор ввода/вывода потока Boost<quoted>размещает разграничители, по умолчанию на двойную цитату (<">), вокруг строк на выходе и снимает разграничители на входе. Это обеспечивает струны со встроенными пространствами туда и обратно по желанию. Например,
std::stringstream ss; std::string original = "fooled you"; std::string round_trip; ss << quoted(original); ss >> quoted(round_trip); std::cout << quoted(original); // outputs: "fooled you" std::cout << round_trip; // outputs: fooled you assert(original == round_trip); // assert will not fire
Если строка содержит характер делимитера, на выходе этому персонажу будет предшествовать персонаж побега, как и самому персонажу побега:
std::cout << quoted("'Jack & Jill'", '&', '\''); // outputs: '&'Jack && Jill&''
namespace boost
{
namespace io
{
// manipulator for const std::basic_string&
template <class Char, class Traits, class Alloc>
unspecified-type1 quoted(const std::basic_string<Char, Traits, Alloc>& string, Char escape='\\', Char delim='\"');
// manipulator for const C-string*
template <class Char>
unspecified-type2 quoted(const Char* string, Char escape='\\', Char delim='\"');
// manipulator for non-const std::basic_string&
template <class Char, class Traits, class Alloc>
unspecified-type3 quoted(std::basic_string<Char, Traits, Alloc>& string, Char escape='\\', Char delim='\"');
}
}
<unspecified_type1>,<unspecified_type2>и<unspecified_type3>представляют собой поставляемые типы реализации с поставляемой реализацией.<operator<<>:
template <class Char, class Traits> std::basic_ostream<Char, Traits>& operator<<(std::basic_ostream<Char, Traits>& os, constunspecified_typeN& proxy);Эффекты:Вставить символы в<
os>:
delim.- Каждый персонаж в
string.escapeилиdelim, как определеноoperator==, первый выходescape.delim.Замечания:<
string>,<escape>и<delim>имеют тип и значение соответствующих аргументов призыва к<quoted>функции, которая построена<proxy>.Возвращение:<
os>.
<unspecified_type3>представляет собой поставляемый тип реализации с поставляемой реализацией<operator>>>:
template <class Char, class Traits> std::basic_istream<Char, Traits>& operator>>(std::basic_istream<Char, Traits>& is, constunspecified_type3& proxy);Эффекты:Выдержки из<
os>:
- Если же первый из них равен делиму, как определено
operator==, то:
- Выключите
skipwsфлаг.string.clear()- До тех пор, пока не достигнут неизбежный
delimсимвол илиis.not_good(), извлеките символы изosи приложите их кstring, за исключением того, что, если достигнутescape, проигнорируйте его и приложите следующий символ кstring.- Откажитесь от финального персонажа
delim.- Восстановите флаг
skipwsдо его первоначального значения.- В противном случае
os >> string.Замечания:<
string>,<escape>и<delim>имеют тип и значение соответствующих аргументов призыва к<quoted>функции, которая построена<proxy>.Возвращение:<
is>.
Потоковый манипулятор<quoted()>возник из обсуждений списка рассылки разработчиков Boost. Среди участников были Беман Доуз, Роб Стюарт, Александр Ламейсон, Эрик Ниблер, Висенте Ботет, Андрей Семашев, Фил Ричардс и Роб Мюррей. Предложения Эрика Ниблера послужили основой для названия и формы шаблонов.
© Авторское право Beman Dawes, 2002, 2006, 2007, 2009, 2010
Распространяется в соответствии с Лицензией на программное обеспечение Boost, версия 1.0. См.www.boost.org/LICENSE_1_0.txt
Пересмотрено20 июня 201020 June 2010[ORIG_END] -->
Статья Boost "quoted" I/O manipulator раздела может быть полезна для разработчиков на c++ и boost.
:: Главная :: ::
реклама |