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

Converters

Boost , Chapter 1. Boost.Convert 2.0 , Chapter 1. Boost.Convert 2.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

Усиление:Преобразование()API играет свою роль, предоставляяединый интерфейс.и обеспечениепоследовательного поведения. Тем не менее, это соответствующий преобразователь, который выполняет тяжелую работу фактического преобразования типа.

Дизайн Boost.Convertотражает тот факт, что ни один преобразователь не удовлетворяет всем мыслимым требованиям пользователей, связанным с конверсией/трансформацией. Следовательно,расширяемостьиподключаемость преобразователяявляются важными свойствами.Boost.Convert.Boost.Convertпредоставляет несколько преобразователей для конверсий общего типа с различной степенью поддержки форматирования и производительности. Тем не менее, ожидается, что будут написаны и развернуты более универсальные и индивидуальные преобразователи.Усиление.Обратите.

Чтобы преобразователь был подключен кBoost.ConvertFramework, он должен бытьCallableс одной из подписей:

template<typename TypeOut, typename TypeIn>
void operator()(TypeIn const& value_in, boost::optional<TypeOut>& result_out) const;
template<typename TypeOut, typename TypeIn>
void operator()(TypeIn value_in, boost::optional<TypeOut>& result_out) const;

если это преобразователь общего назначения, способный обрабатывать многие типы (например, преобразования строки в тип и типа в строку). Альтернативно, специально созданный пользовательский конвертер может только позаботиться о том, чтобы обеспечить

void operator()(TypeIn const&, boost::optional<TypeOut>&) const;

если его единственной целью является обработка одного конкретного преобразования / преобразованияТип ВдоTypeOut. Например, конвертер из струнного формата MBCS для конкретной операционной системы в UCS-2 или UCS-4 (в зависимости от размераwchar_t) может быть одним из таких примеров:

void operator()(std::string const&, boost::optional<std::wstring>&) const;

Кроме того, в качестве преобразователя может быть предусмотрен специальный запасной, вызывающий вызов. Например,

using std::string;
using boost::lexical_cast;
using boost::convert;

int v03 = convert<int>(str,
              boost::bind(assign<int>, _2,
                  boost::bind(lexical_cast<int, string>, _1))).value_or(-1);

или старомодная функция:

void plain_old_func(string const& value_in, boost::optional<int>& value_out)

int v01 = convert<int>(str, plain_old_func).value_or(-1);

Что касается преобразователейBoost.Convertфреймворк был разработан с учетом следующих требований:

[Note]Note

Конвертеры должны быть независимыми и не должны полагаться на.Усиление.Преобразованиеинфраструктуры.

Implicit TypeIn Promotions and Conversions

Вероятно, стоит упомянуть, чтоTypeInв подписи нужно интерпретировать не буквально, а скорее в контексте потенциальных имплицитных рекламных акций и конверсий типов, разрешенныхязыком. В зависимости от контекста преобразователиtake_doubleиtake_intмогут не делать того, что от них ожидается, из-за имплицитногоint-to-doubleпродвижения и разрушения стоимостиdouble-to-intпреобразования, примененногокомпилятором:

struct take_double { void operator()(double, boost::optional<string>&) const {}};
struct    take_int { void operator()(int, boost::optional<string>&) const {}};

convert<string>(11, take_double()); // Compiler applies 'int' to 'double' promotion to call the converter.
convert<string>(11.23, take_int()); // Compiler applies 'double' to 'int' implicit truncation.

повысить::преобразовать[]API не модифицироватьTypeInили интерпретировать его каким-либо образом. Передаваемое значение и его тип доставляются в базовый преобразователь как есть. Следовательно, если потенциальные неявные рекламные акции и конверсии нежелательны, ответственность за решение этой проблемы лежит на преобразователе. Например, одним из способов отключения неявных конверсий может быть:

struct double_only
{
    // Declared for all types.
    template<typename TypeIn> void operator()(TypeIn, boost::optional<string>&) const;
};
// Defined only for certain types.
template<> void double_only::operator()<double>(double, boost::optional<string>&) const {}

    convert<string>(11.23, double_only()); // Fine.
//  convert<string>(11,    double_only()); // Fails: undefined reference to double_only::operator()<int>


PrevUpHomeNext

Статья Converters раздела Chapter 1. Boost.Convert 2.0 Chapter 1. Boost.Convert 2.0 может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Chapter 1. Boost.Convert 2.0 ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 22:37:54/0.0070619583129883/0