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

Tutorial

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 13. Boost.Function

BoostC++ 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

Tutorial

Повышаю. Функция имеет две синтаксические формы: предпочтительную и переносную. Предпочтительная форма более тесно вписывается в язык C++ и уменьшает количество отдельных параметров шаблона, которые необходимо учитывать, часто улучшая читаемость; однако предпочтительная форма поддерживается не на всех платформах из-за ошибок компилятора. Совместимая форма будет работать на всех компиляторах, поддерживаемых Boost. Функция. Проконсультируйтесь с таблицей ниже, чтобы определить, какую синтаксическую форму использовать для компилятора.

Preferred syntaxPortable syntax
  • GNU C++ 2.95.x, 3.0.x и более поздние версии
  • Comeau C++ 4.2.45.2
  • SGI MIPSpro 7.3.0
  • Intel C++ 5.0, 6.0
  • Compaq's cxx 6.2
  • Microsoft Visual C++ 7.1 и более поздние версии
  • Любой компилятор, поддерживающий предпочтительный синтаксис
  • Microsoft Visual C++ 6.0, 7.0
  • Borland C++ 5.5.1
  • Sun Workshop 6 обновление 2 C++ 5.3
  • Обсуждение Metrowerks CodeWarrior 8.1

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

Basic Usage

Обертка функции определяется просто путем инстанцирования шаблона класса<function>с желаемым типом возврата и типами аргументов, сформулированными как тип функции C++. Может быть представлено любое количество аргументов, вплоть до определенного предела реализации (10 является максимумом по умолчанию). Следующее объявляет обертку объекта функции<f>, которая принимает два<int>параметра и возвращает<float>:

Preferred syntaxPortable syntax
boost::function<float (int x, int y)> f;
boost::function2<float, int, int> f;

По умолчанию обертки объектов функции пусты, поэтому мы можем создать объект функции, который можно назначить<f>:

struct int_div { 
  float operator()(int x, int y) const { return ((float)x)/y; }; 
};

f = int_div();

Теперь мы можем использовать<f>для выполнения основной функции объекта<int_div>:

std::cout << f(5, 3) << std::endl;

Мы можем назначить любой совместимый объект функции<f>. Если бы<int_div>было заявлено о приеме двух<long>операндов, то к аргументам без вмешательства пользователя применялись бы неявные преобразования. Единственным ограничением на типы аргументов является то, что они являются CopyConstructible, поэтому мы можем использовать ссылки и массивы:

Preferred syntax
boost::function<void (int values[], int n, int& sum, float& avg)> sum_avg;

Portable syntax
boost::function4<void, int*, int, int&, float&> sum_avg;

void do_sum_avg(int values[], int n, int& sum, float& avg)
{
  sum = 0;
  for (int i = 0; i < n; i++)
    sum += values[i];
  avg = (float)sum / n;
}

sum_avg = &do_sum_avg;

Вызов обертки функционального объекта, которая на самом деле не содержит функционального объекта, является нарушением предварительного условия, подобно попытке вызвать нулевой указатель функции и бросить исключение<bad_function_call>. Мы можем проверить обертку пустого функционального объекта, используя ее в булевом контексте (она оценивает<true>, если обертка не пуста) или сравнить ее с<0>. Например:

if (f)
  std::cout << f(5, 3) << std::endl;
else
  std::cout << "f has no target, so it is unsafe to call" << std::endl;

В качестве альтернативы<empty>метод возвращает, является ли обертка пустой.

Наконец, мы можем очистить целевую функцию, назначив ее<0>или назвав функцию<clear>(), например,

f = 0;

Free functions

Бесплатные указатели функций можно считать однотонными функциональными объектами с операторами вызовов функций const, и поэтому их можно непосредственно использовать с обертками функциональных объектов:

float mul_ints(int x, int y) { return ((float)x) * y; }

f = &mul_ints;

Обратите внимание, что<&>не требуется, если вы не используете Microsoft Visual C++ версии 6.

Member functions

Во многих системах обратный вызов часто вызывает членские функции конкретного объекта. Это часто называют «аргументным связыванием» и выходит за рамки Boost. Функция. Однако поддерживается прямое использование функций-членов, поэтому действителен следующий код:

struct X {
  int foo(int);
};

Preferred syntaxPortable syntax
boost::function<int (X*, int)> f;
f = &X::foo;
  
X x;
f(&x, 5);
boost::function2<int, X*, int> f;
f = &X::foo;
  
X x;
f(&x, 5);

Существует несколько библиотек, поддерживающих связывание аргументов. Ниже приводится резюме трех таких библиотек:

  • Связь. Эта библиотека позволяет связывать аргументы для любого функционального объекта. Он легкий и очень портативный.

  • ]
    boost::function<int (int)> f;
    X x;
    f = std::bind1st(
          std::mem_fun(&X::foo), &x);
    f(5); // Call x.foo(5)
    [] [] [] Портативная [
    boost::function1<int, int> f;
    X x;
    f = std::bind1st(
          std::mem_fun(&X::foo), &x);
    f(5); // Call x.foo(5)

    [!-- [ORIG_BEGIN]

    [C++] Стандартная библиотека. Используяstd::bind1stиstd::mem_funвместе, можно связать объект функции указателя с членом для использования с Boost. Функция:

    Предпочтительный синтаксисПортативный синтаксис
    boost::function<int (int)> f;
    X x;
    f = std::bind1st(
          std::mem_fun(&X::foo), &x);
    f(5); // Call x.foo(5)
    boost::function1<int, int> f;
    X x;
    f = std::bind1st(
          std::mem_fun(&X::foo), &x);
    f(5); // Call x.foo(5)

    [ORIG_END] -->[ORIG_END] -->
  • Ламбдабиблиотека. Эта библиотека обеспечивает мощный композиционный механизм для построения функциональных объектов, который использует очень естественный синтаксис C++. Lambda требует компилятора, который соответствует стандарту C++.

References to Function Objects

В некоторых случаях это дорого (или семантически неправильно), чтобы увеличить. Функция клонирует объект функции. В таких случаях можно запросить повышение. Функция содержит только ссылку на реальный объект функции. Это делается с использованием функций<ref>и<cref>для обертывания ссылки на объект функции:

Preferred syntaxPortable syntax
stateful_type a_function_object;
boost::function<int (int)> f;
f = boost::ref(a_function_object);
boost::function<int (int)> f2(f);
stateful_type a_function_object;
boost::function1<int, int> f;
f = boost::ref(a_function_object);
boost::function1<int, int> f2(f);

Здесь<f>не будет делать копии<a_function_object>и<f2>, когда речь идет о<f><a_function_object>. Кроме того, при использовании ссылок на функциональные объекты, повышается. Функция не будет выбрасывать исключения при назначении или строительстве.

Comparing Boost.Function function objects

Обертки функциональных объектов можно сравнить по<==>или<!=>с любым функциональным объектом, который может храниться в обертке. Если обертка функционального объекта содержит функциональный объект такого типа, она будет сравниваться с данным функциональным объектом (который должен быть либо равным, либо перегруженным<boost::function_equal>). Например:

int compute_with_X(X*, int);
f = &X::foo;
assert(f == &X::foo);
assert(&compute_with_X != f);

При сравнении с экземпляром<reference_wrapper>адрес объекта в<reference_wrapper>сравнивается с адресом объекта, хранящегося в обертке объекта функции:

a_stateful_object so1, so2;
f = boost::ref(so1);
assert(f == boost::ref(so1));
assert(f == so1); // Only if a_stateful_object is EqualityComparable
assert(f != boost::ref(so2));

PrevUpHomeNext

Статья Tutorial раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 13. Boost.Function может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Chapter 13. Boost.Function ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:04:28/0.0078699588775635/0