![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
unfused_typedBoost , Chapter 1. Fusion 2.2 , Adapters
|
![]() |
Note |
---|---|
Для Microsoft Visual C++ 7.1 (Visual Studio 2003) обнаружение соответствия функционального объекта легко вызывает внутреннюю ошибку. Поэтому к адаптеру всегда относятся так, как если бы он был конст. |
![]() |
Tip |
---|---|
Если последовательность типов, переданная этому шаблону, содержит нессылочные элементы, элемент копируется только один раз - подпись оператора вызова оптимизируется автоматически, чтобы избежать параметров по значению. |
#include <boost/fusion/functional/adapter/unfused_typed.hpp>
template <class Function, class Sequence> class unfused_typed;
Параметр |
Описание |
По умолчанию |
---|---|---|
|
Унарный Объект полиморфной функции |
|
|
Notation
F
Возможная константа квалифицированного, унарного Объекта полиморфной функции Тип или тип ссылки
f
Объект, конвертируемый в F
S
Последовательность типов параметров
UT
Тип unfused_typed<F,S>
ut
Пример UT
, инициализированный с f
a0
...aN
Аргументы к ut
, конвертируемые в типы в S
Выражение |
Семантика |
---|---|
|
Создает слитую функцию, как описано выше, инициализирует целевую функцию с |
|
Создает слитую функцию, как описано выше, пытается использовать конструктор по умолчанию |
|
Звонки |
struct add_assign // applies operator+= { typedef void result_type; // for simplicity template <typename T> void operator()(T & lhs, T const & rhs) const { lhs += rhs; } }; template <class Tie> class fused_parallel_adder { Tie tie_dest; public: explicit fused_parallel_adder(Tie const & dest) : tie_dest(dest) { } typedef void result_type; template <class Seq> void operator()(Seq const & s) const { for_each( zip(tie_dest,s), fused<add_assign>() ); } }; // accepts a tie and creates a typed function object from it struct fused_parallel_adder_maker { template <typename Sig> struct result; template <class Self, class Seq> struct result< Self(Seq) > { typedef typename remove_reference<Seq>::type seq; typedef unfused_typed< fused_parallel_adder<seq>, typename mpl::transform<seq, remove_reference<_> >::type > type; }; template <class Seq> typename result< void(Seq) >::type operator()(Seq const & tie) { return typename result< void(Seq) >::type( fused_parallel_adder<Seq>(tie) ); } }; unfused<fused_parallel_adder_maker> parallel_add; void try_it() { int a = 2; char b = 'X'; // the second call is strictly typed with the types deduced from the // first call parallel_add(a,b)(3,2); parallel_add(a,b)(3); parallel_add(a,b)(); assert(a == 8 && b == 'Z'); }
Статья unfused_typed раздела Chapter 1. Fusion 2.2 Adapters может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |