![]() |
![]() ![]() ![]() ![]() |
![]() |
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.
:: Главная :: ::
реклама |