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

Relation to other Boost libraries

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 18. Boost.Lambda

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

Relation to other Boost libraries

Boost Function

Иногда удобно хранить лямбда-функторы в переменных. Однако типы даже самых простых лямбда-функторов длинные и громоздкие, и вообще невозможно объявить переменные с типами лямбда-функторов.Библиотека функций повышенияФункцияопределяет обертки для произвольных функциональных объектов, например лямбда-функторов; и эти обертки имеют типы, которые легко печатать. Например:

boost::function<int(int, int)> f = _1 + _2;
boost::function<int&(int&)> g = (_1 += 10);
int i = 1, j = 2;
f(i, j); // returns 3
g(i);    // sets i to = 11;

Типы возврата и параметров обернутого функционального объекта должны быть написаны в качестве аргумента шаблона для шаблона обертки<boost::function>; даже когда обернуты лямбда-функторы, которые в противном случае имеют общие параметры. Обертывание функционального объекта с помощью<boost::function>вводит стоимость производительности, сопоставимую с отправкой виртуальной функции, хотя виртуальные функции фактически не используются. Обратите внимание, что хранение лямбда-функторов внутри<boost::function>представляет опасность. Некоторые типы лямбда-функторов могут хранить ссылки на связанные аргументы, вместо этого принимая копии аргументов выражения лямбда. Когда временные объекты лямбда-функтора используются в вызовах алгоритма STL, это всегда безопасно, так как лямбда-функтор разрушается сразу после завершения вызова алгоритма STL. Тем не менее, лямбда-функтор, завернутый внутрь<boost::function>, может продолжать существовать дольше, создавая возможность висячих ссылок. Например:

int* sum = new int();
*sum = 0;
boost::function<int&(int)> counter = *sum += _1;
counter(5); // ok, *sum = 5;
delete sum; 
counter(3); // error, *sum does not exist anymore

Boost Bind

Укрепление связиБиблиотека имеет частично перекрывающуюся функциональность с BLL. В основном, библиотека Boost Bind (BB в продолжении) реализует часть выражения связывания BLL. Однако существуют некоторые семантические различия.

BLL и BB развивались отдельно и имеют разные реализации. Это означает, что выражения связывания из BB не могут быть использованы в выражениях связывания или в других типах лямбда-выражений BLL. То же самое относится к использованию выражений BLL-связи в BB. Однако библиотеки могут сосуществовать, поскольку имена библиотеки BB находятся в<boost>пространстве имен, тогда как имена BLL находятся в<boost::lambda>пространстве имен.

BLL требует компилятора, который разумно соответствует стандарту C++, в то время как библиотека BB более портативна и работает с большим набором компиляторов.

Следующие два раздела описывают семантические различия между выражениями связывания в BB и BLL.

First argument of bind expression

In BB the first argument of the bind expression, the target function, is treated differently from the other arguments, as no argument substitution takes place within that argument. In BLL the first argument is not a special case in this respect. For example:
template<class F>
int foo(const F& f) {
  int x;
  ..
  bind(f, _1)(x);
  ...
}
int bar(int, int);
nested(bind(bar, 1, _1));
The bind expression inside foo becomes:
bind(bind(bar, 1, _1), _1)(x)
The BLL interpretes this as:
bar(1, x)(x)
whereas the BB library as
bar(1, x)
To get this functionality in BLL, the bind expression inside the foo function can be written as:
bind(unlambda(f), _1)(x);
as explained in the section called “Unlambda”.

Библиотека BB поддерживает до девяти заполнителей, в то время как BLL определяет только три заполнителя. Обоснование непредоставления большего заключается в том, что наибольшая частота объектов функций, принимаемых любым алгоритмом STL, равна двум. Количество заполнителей легко увеличить в библиотеке BB. В БЛЛ это возможно, но более трудоемко. BLL в настоящее время передает фактические аргументы лямбда-функторам внутри, так же, как они есть, и не заворачивает их в объект кортежа. Причина этого заключается в том, что некоторые широко используемые компиляторы не способны оптимизировать промежуточные объекты. Создание промежуточных связок вызвало бы значительный удар по производительности, особенно для самых простых (и, следовательно, наиболее распространенных) лямбда-функторов. Мы работаем над гибридным подходом, который позволит большему количеству заполнителей, но не поставит под угрозу производительность простых лямбда-функторов.


PrevUpHomeNext

Статья Relation to other Boost libraries раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 18. Boost.Lambda может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Chapter 18. Boost.Lambda ::


реклама


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

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