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

Tutorial

Boost , Chapter 1. Boost.Functional/OverloadedFunction 1.0.0 , Chapter 1. Boost.Functional/OverloadedFunction 1.0.0

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

В этом разделе рассказывается, как пользоваться библиотекой.

Рассмотрим следующие функции, которые имеют различные подписи:

const std::string& identity_s(const std::string& x) // Function (as pointer).
    { return x; }
int identity_i_impl(int x) { return x; }
int (&identity_i)(int) = identity_i_impl; // Function reference.
double identity_d_impl(double x) { return x; }
boost::function<double (double)> identity_d = identity_d_impl; // Functor.

Этот заголовок библиотеки<boost/functional/overloaded_function.hpp>предоставляет шаблон класса<boost::overloaded_function>, который создает один перегруженный объект функции, который можно использовать для вызова указанных функций вместо использования отдельных имен функций (см. также<functor.cpp>и<identity.hpp>):

boost::overloaded_function<
      const std::string& (const std::string&)
    , int (int)
    , double (double)
> identity(identity_s, identity_i, identity_d);
// All calls via single `identity` function.
BOOST_TEST(identity("abc") == "abc");
BOOST_TEST(identity(123) == 123);
BOOST_TEST(identity(1.23) == 1.23);

Обратите внимание, как каждый тип функции передается в качестве параметра шаблона<boost::overloaded_function>с использованием следующего синтаксиса (этоBoost.Functionпредпочтительный синтаксис):

result-type (argument1-type, argument2-type, ...)

Затем относительные указатели функций, ссылки на функции илимономорфные объекты функциипередаются конструктору<boost::overloaded_function>, соответствующему порядку заданных параметров шаблона.2]В приведенном выше примере<identity_s>передается в качестве указателя функции (адрес функции автоматически берется из имени функции компилятором),<identity_i>в качестве ссылки на функцию и<identity_d>в качестве объекта функции.

Все указанные типы функций должны иметь отличные друг от друга параметры (так что перегруженные вызовы могут быть разрешены этой библиотекой).3Для создания перегруженного функционального объекта необходимо указать как минимум два типа функций (потому что перегрузки между одной или нулевой функцией не существует).

Для удобства эта библиотека также предоставляет шаблон функции<boost::make_overloaded_function>, который позволяет создавать перегруженный объект функции без явного указания типов функций. Типы функций автоматически выводятся из указанных функций, и соответствующее<boost::overloaded_function>инстанцирование возвращается<boost::make_overloaded_function>.

Шаблон функции<boost::make_overloaded_function>может быть полезен при использовании вместе сBoost.Typeof's<BOOST_AUTO>(или C++11<auto>). Например,<make_decl.cpp>и<identity.hpp>:

BOOST_AUTO(identity, boost::make_overloaded_function(
        identity_s, identity_i, identity_d));
BOOST_TEST(identity("abc") == "abc");
BOOST_TEST(identity(123) == 123);
BOOST_TEST(identity(1.23) == 1.23);

Обратите внимание, что объект<identity>перегруженной функции был создан, указывая только функции<identity_s>,<identity_i>,<identity_d>и без указания типов функций<conststd::string&(const std::string&)>,<int(int)>и<double(double)>, как требуется вместо<boost::overloaded_function>. Таким образом,<boost::make_overloaded_function>обеспечивает более краткий синтаксис в этом контексте по сравнению с<boost::overloaded_function>.

Другой случай, когда<boost::make_overloaded_function>может быть полезным, это когда перегруженный объект функции передается шаблону функции, который может содержать конкретный тип<boost::overloaded_function>с использованием параметра шаблона. Например,<make_call.cpp>и<identity.hpp>:

template<typename F>
void check(F identity) {
    BOOST_TEST(identity("abc") == "abc");
    BOOST_TEST(identity(123) == 123);
    BOOST_TEST(identity(1.23) == 1.23);
}

check(boost::make_overloaded_function(identity_s, identity_i, identity_d));

Реализация библиотеки<boost::make_overloaded_function>используетBoost.Typeofдля автоматического вывода некоторых типов функций. Для составления кода вBoost. Типрежима эмуляции, все типы должны быть надлежащим образом зарегистрированы с использованием<BOOST_TYPEOF_REGISTER_TYPE>и<BOOST_TYPEOF_REGISTER_TEMPLATE>, или должны быть включены соответствующиезаголовки Boost.Typeof(см.Boost.Typeofдля получения дополнительной информации). Для приведенных выше примеров достаточно включить заголовокBoost.Typeof, который регистрирует<std::string>(эта библиотека не требует регистрации<boost::function>дляBoost.Typeofэмуляции):

#include <boost/typeof/std/string.hpp> // No need to register `boost::function`.



2Функциональные указатели имеют форму<result-type><(*)(><argument1-type><,...)>(компилятор C++ обычно способен автоматически продвигать имя функции в указатель функции в контексте, где ожидается указатель функции, даже если имя функции не является префиксом<&>). Функциональные ссылки имеют вид<result-type><(&)(><argument1-type><,...)>. Типы функций имеют форму<result-type><(><argument1-type><,...)>(обратите внимание на то, что они не имеют как<*>, так и<&>по сравнению с указателями функций и ссылками на функции). Наконец, объекты мономорфных функций являются экземплярами классов с нешаблонным оператором вызова формы<result-type><operator()(><argument1-type><,...)>. К сожалению, невозможно поддерживать объекты полиморфных функций (см.http://lists.boost.org/Archives/boost/2012/03/191744.php)..

3Обратите внимание, что в C++ тип результата функции не используется для разрешения перегрузки (чтобы избежать зависимости контекста разрешения перегрузки). Следовательно, по меньшей мере один из параметров функции должен отличаться для каждого заданного типа функции.


PrevUpHomeNext

Статья Tutorial раздела Chapter 1. Boost.Functional/OverloadedFunction 1.0.0 Chapter 1. Boost.Functional/OverloadedFunction 1.0.0 может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Chapter 1. Boost.Functional/OverloadedFunction 1.0.0 ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 23:44:52/0.0076949596405029/0