![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
THE BOOST MPL LIBRARY: The lambda MetafunctionBoost , ,
|
Front Page / Tutorial: Metafunctions and Higher-Order Metaprogramming / Handling Placeholders / The lambda Metafunction |
Мы можемгенерироватькласс метафункций изboost::add_pointer<_1>, используя MPLлямбдаМетафункция:
template <class X> struct two_pointers : twice<typename mpl::lambda<boost::add_pointer<_1> >::type, X> {}; BOOST_STATIC_ASSERT(( boost::is_same< two_pointers<int>::type , int** >::value ));
Мы будем ссылаться на классы метафункций, такие какadd_pointer_fи выражения заполнителей, такие какboost::add_pointer<_1>каклямбда выражения. Термин, означающий "неназванный функциональный объект", был введен в 1930-х годах логиком Алонзо Черчом как часть фундаментальной теории вычислений, которую он назваллямбда-исчислением.MPL использует несколько неясное словолямбдаиз-за его устоявшегося прецедента в функциональных языках программирования.
[4] | См.http://en.wikipedia.org/wiki/Lambda_calculusдля углубленного рассмотрения, включая ссылку на документ Церкви, доказывающий, что эквивалентность выражений лямбды в целом неразрешима. |
Хотя его основная цель состоит в том, чтобы превратить выражения заполнителей в классы метафункций,mpl::lambdaможет принять любое выражение лямбда, даже если это уже класс метафункций. В этом случаелямбдавозвращает свой аргумент без изменений. Алгоритмы MPL, такие как, трансформируют, называютлямбдавнутренне, прежде чем вызывать полученный класс метафункций, так что они одинаково хорошо работают с любым видом лямбда-выражения. Мы можем применить ту же стратегию кдважды:
template <class F, class X> struct twice : apply1< typename mpl::lambda<F>::type , typename apply1< typename mpl::lambda<F>::type , X >::type > {};
Теперь мы можем использоватьдваждыс метафункциональными классамиивыражениями заполнителей:
int* x; twice<add_pointer_f, int>::type p = &x; twice<boost::add_pointer<_1>, int>::type q = &x;
Статья THE BOOST MPL LIBRARY: The lambda Metafunction раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: ::
реклама |