Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Именованные параметры Boost

Anna | 24.06.2014 | нет комментариев

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

bool foo(int important, int& pOut, int sometimes = 1, int occasionally = 2, int rarely = 3)
{
//...
}

Задачи тут могут быть следующие

  1. Пользователи непрерывно путают порядок параметров, тип их фактически всецело совпадает, следственно компилятор ничем подмогнуть не может (разве что изредка со вторым параметром).
  2. Из необязательных параметров Почаще каждого необходим один, причем если это не sometimes, пользователи обязаны припоминать значения по умолчанию, Дабы задать их в вызове очевидно. Значения по умолчанию различные, так что ошибок вновь много
  3. Нет никакой вероятности выразить связанность значений по умолчанию одних параметров от других.

Задачи эти дозволено решить по-различному: передавать в качестве параметра конструкцию, применять перегрузку функций либо даже функции с различными именами… Boost предлагает еще один вариант решения.

Это именованные параметры. Огромнее мы не привязаны к порядку следования параметров, вероятность же задавать понятые имена при вызове значительно снижает вероятность ошибок. В качестве добавочного бонуса получаем вероятность применять одни параметры при вычислении значения по умолчанию других.

В качестве примера разглядим, как дозволено определить функцию foo с применением предлагаемого механизма (имя изменим на namedParametersFoo, Дабы не было путаницы). Для начала подключаем заголовочный файл boost и определяем имена параметров с поддержкой особого макроса. Обратите внимания — никаких знаков препинания.

#include <boost/parameter.hpp>

BOOST_PARAMETER_NAME(important)
BOOST_PARAMETER_NAME(pOut)
BOOST_PARAMETER_NAME(sometimes)
BOOST_PARAMETER_NAME(occasionally)
BOOST_PARAMETER_NAME(rarely)

дальше задаем функцию

BOOST_PARAMETER_FUNCTION(
	(bool),
	namedParametersFoo,
	tag,
	(required 
		(important, *)
		(in_out(pOut), *)
	)
	(optional
		(sometimes, *, important * 2)
		(occasionally, *, 300)
		(rarely, *, 400)
	)
) 
{
// Тело функции
}

Макросу передается четыре параметра, разделяемых запятыми

  1. Тип возвращаемого значения — непременно в скобках
  2. Имя функции
  3. Пространство имен с параметрами. BOOST_PARAMETER_NAME механически помещает объявления в tag
  4. Список параметров

Список параметров имеет свою конструкцию. Также, подметьте, знаков препинания фактически никаких — есть только запятые при определении непосредственных параметров.

Сначала идет блок required. Как следует из наименования, он содержит список непременных параметров. Всякий параметр должен быть размещен в круглые скобки. Для определения непременного параметра нужно задать его имя и ограничения типа. В данной статье механизм ограничения типов не рассматривается, следственно будем легко применять звездочку. Подробнее на эту тему дозволено почитать тут.

После этого следует блок необязательных параметров. Тут при определении всякого параметра возникает добавочная вероятность задать значение по умолчанию. Как видно из примера выше, дозволено применять в выражениях остальные параметры.

Собственно все. Функция поддерживает вызовы «по старинке» — как если бы была определена с обыкновенными необязательными параметрами. Т.е. как словно заработал вариант

bool newFoo(int important, int& pOut, int sometimes = important * 2, int occasionally = 2, int rarely = 3)
{
//...
}

newFoo не скомпилируется из-за зависимости параметра sometimes от important 

Т.е. дозволено применять namedParametersFoo так

	int s = 0;
	namedParametersFoo(1, s, 1, 1, 1);
	namedParametersFoo(1, s, 1, 1);
	namedParametersFoo(1, s, 1);
	namedParametersFoo(1, s);

Но это еще не все! Задействовав именованные параметры, мы освобождаем себя как от порядка следования доводов, так и от непременных непотребных значений по умолчанию. Исключительное неудобство — требуется добавлять знак подчеркивания сначала имен.

namedParametersFoo(_sometimes = 1, _important = 111, _pOut = s);

Выходит, что в этом примере нового отменного

  1. Наглядность — видно, что именно мы имеем в виду под числами 1 и 111, вероятность запутаться/ошибиться снижается
  2. Произвольный порядок — добровольный параметр написан первым, и все работает

Невзирая на то, что возникла вероятность изменять позицию непременных параметров и даже смешивать их с необязательными, все продолжает контролироваться на этапе компиляции, т.е. дальнейший код

namedParametersFoo(_sometimes = 1, _pOut = s);

не соберется — пропущен нужный параметр _important

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

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB