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

Converter Signature

Boost , Chapter 1. Boost.Convert 2.0 , Design Notes

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

Были рассмотрены следующие подписи преобразователя:

bool operator()(TypeIn const&, TypeOut&); //#1
void operator()(TypeIn const&, boost::optional<TypeOut>&); //#2
boost::optional<TypeOut> operator()(TypeIn const&); //#3

С точки зрения дизайна подпись #1 имеет преимущество в обеспечении наилучшегоразделения проблем. А именно, он оставляет соответствующему преобразователю только одну задачу — фактическую задачу преобразования. На практике это может привести к ненужным накладным расходам. А именно, учитывая экземплярTypeOutтип поставляется извне, хранилище для этого экземпляра должно быть выделено и, самое главное, инициализировано. Эта фаза инициализации (которая может быть дорогостоящей) является ненужными накладными расходами, поскольку, если операция преобразования увенчалась успехом, начальное значение переопределяется фактическим результатом, если оно не увенчалось успехом, то значениеTypeOutпример либо бессмысленный, либо хуже вводящий в заблуждение.

Подпись #2 позволяет избежать накладных расходов на инициализацию путем развертывания<boost::optional>возможности выделения хранилищабез инициализации его.. Теперь о храненииTypeOutпо-прежнему выделяется наружу, но не инициализируется. Теперь обязанность преобразователя знатькакинициализироватьВыберитеэкземпляр и, когданеобходимо, чтобы фактически инициализировать его. На практике это обычно проще, чем может показаться. Например,<strtol()>-конвертер может иметь что-то вдоль следующих линий:

void operator()(char const* str_in, boost::optional<int>& result_out) const
{
   char const* str_end = str_in + strlen(str_in);
   char*       cnv_end = 0;
   long int     result = ::strtol(str_in, &cnv_end, base_);
   if (INT_MIN <= result && result <= INT_MAX && cnv_end == str_end)
       result_out = int(result);
}

Подпись #3 была кратко рассмотрена как эстетически выгодная и более идиоматическая. К сожалению, в нем не было автоматического вычетаTypeOut, который, следовательно, должен был быть указан явно. Для различных типов поддерживаемых преобразователей (классовые, простые старые функции, лямбда), которые значительно усложнили реализацию.Boost.Convertинфраструктура и ограниченная реализация соответствующих преобразователей.


PrevUpHomeNext

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




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



:: Главная :: Design Notes ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 23:33:09/0.0085039138793945/1