Были рассмотрены следующие подписи преобразователя:
bool operator()(TypeIn const&, TypeOut&);
void operator()(TypeIn const&, boost::optional<TypeOut>&);
boost::optional<TypeOut> operator()(TypeIn const&);
С точки зрения дизайна подпись #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инфраструктура и ограниченная реализация соответствующих преобразователей.