Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Synopsis

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 19. Boost.Lexical_Cast 1.0

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Особенности библиотеки определены вboost/lexical_cast.hpp:

namespace boost
{
    class bad_lexical_cast;
    template<typename Target, typename Source>
      Target lexical_cast(const Source& arg);
    template <typename Target>
      Target lexical_cast(const AnyCharacterType* chars, std::size_t count);
    namespace conversion
    {
        template<typename Target, typename Source>
            bool try_lexical_convert(const Source& arg, Target& result);
        template <typename AnyCharacterType, typename Target>
            bool try_lexical_convert(const AnyCharacterType* chars, std::size_t count, Target& result);
    } // namespace conversion
} // namespace boost

template<typename Target, typename Source>
  Target lexical_cast(const Source& arg);

Возвращает результат потоковой передачи arg в стандартный библиотечный поток на основе строк, а затем в качестве целевого объекта. Там, где Target либо<std::string>, либо<std::wstring>, извлечение потока принимает все содержимое строки, включая пробелы, а не полагается на поведение по умолчанию<operator>>>. В случае неудачного обращения, исключение составляет<bad_lexical_cast>.

template <typename Target>
  Target lexical_cast(const AnyCharacterType* chars, std::size_t count);

Принимает массив<count>символов в качестве входного параметра и передает их в качестве целевого объекта. В случае неудачного обращения<bad_lexical_cast>забрасывается исключение. Этот вызов может быть полезен для обработки ненулевого завершенного массива символов или обработки только некоторой части массива символов.

Требования к аргументу и типам результатов для обеих функций:

  • Источник является исходным потоком, то есть определяется<operator<<>, который принимает<std::ostream>или<std::wostream>объект с левой стороны и экземпляр типа аргумента справа.
  • Цель является вводимой, что означает, что определено<operator>>>, который принимает<std::istream>или<std::wistream>объект с левой стороны и экземпляр типа результата справа.
  • Целевой объект является CopyConstructible [20.1.3].
  • Цель является конструктивной по умолчанию, что означает возможность инициализации объекта такого типа по умолчанию [8.5, 20.1.4].

Тип символа основного потока предполагается<char>, если только<Source>или<Target>не требует широкохарактерной потоковой передачи, и в этом случае основной поток использует<wchar_t>. Следующие типы также могут использовать<char16_t>или<char32_t>для широкохарактерной потоковой передачи:

  • Одиночный персонаж:<char16_t>,<char32_t>
  • Произведения:<char16_t *>,<char32_t *>,<const char16_t*>,<constchar32_t *>
  • Струны:<std::basic_string>,<boost::containers::basic_string>
  • <boost::iterator_range<WideCharPtr>>, где<WideCharPtr>— указатель на широкий символ или указатель на широкий символ
  • <boost::array<CharT,N>>и<std::array<CharT,N>>,<boost::array<constCharT,N>>и<std::array<constCharT,N>>
[Important]Important

Многие компиляторы и библиотеки среды выполнения не могут делать конверсии с использованием новых символов Unicode. Убедитесь, что следующий код компилирует и выводит ненулевые значения, прежде чем использовать новые типы:

std::cout
    << boost::lexical_cast<std::u32string>(1.0).size()
    << "  "
    << boost::lexical_cast<std::u16string>(1.0).size();

Там, где требуется более высокая степень контроля над конверсиями,<std::stringstream>и<std::wstringstream>предлагают более подходящий путь. В тех случаях, когда требуются конверсии, не основанные на потоке,<lexical_cast>является неправильным инструментом для работы и не предназначен для таких сценариев.

class bad_lexical_cast : public std::bad_cast
{
public:
    ... // same member function interface as std::exception
};

Исключение используется для обозначения сбоя lexical_cast.

boost::lexical_cast remains the main interface for lexical conversions. It must be used by default in most cases. However some developers wish to make their own conversion functions, reusing all the optimizations of the boost::lexical_cast. That's where the boost::conversion::try_lexical_convert function steps in.

try_lexical_convert returns true if conversion succeeded, otherwise returns false. If conversion failed and false was returned, state of result output variable is undefined.

На самом деле<boost::lexical_cast>реализуется с использованием<try_lexical_convert>:

template <typename Target, typename Source>
inline Target lexical_cast(const Source &arg)
{
    Target result;
    if (!conversion::try_lexical_convert(arg, result))
        throw bad_lexical_cast();
    return result;
}

try_lexical_convert relaxes the CopyConstructible and DefaultConstructible requirements for Target type. Following requirements for Target and Source remain:

  • Источник должен быть OutputStreamable, что означает, что<operator<<>определено, что берет<std::ostream>или<std::wostream>объект с левой стороны и экземпляр типа аргумента справа.
  • Цель должна быть InputStreamable, что означает, что определен<operator>>>, который принимает<std::istream>или<std::wistream>объект с левой стороны и экземпляр типа результата справа.

PrevUpHomeNext

Статья Synopsis раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 19. Boost.Lexical_Cast 1.0 может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 19. Boost.Lexical_Cast 1.0 ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:40:40/0.0073878765106201/0