![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
THE BOOST MPL LIBRARY: Handling PlaceholdersBoost , ,
|
Front Page / Tutorial: Metafunctions and Higher-Order Metaprogramming / Handling Placeholders |
Наша реализациядваждыуже работает с классами метафункций. В идеале мы хотели бы, чтобы он работал и с выражениями заполнителей, во многом такими же, какmpl::transform.позволяет нам пройти любую форму. Например, мы хотели бы иметь возможность написать:
template <class X> struct two_pointers : twice<boost::add_pointer<_1>, X> {};
Но когда мы смотрим на реализациюboost::add_pointer, становится ясно, что текущее определениедваждыне может работать таким образом.
template <class T> struct add_pointer { typedef T* type; };
Чтобы быть инвокируемымдважды,бустер::add_pointer<_1>должен быть классом метафункций, вдоль линийadd_pointer_f. Вместо этого это просто нулевая метафункция, возвращающая почти бессмысленный тип_1*. Любая попытка использоватьдва_пойнтерапотерпит неудачу, когдаприменимо1достигает вложенной::применитьметафункцию вусилите::add_pointer<_1>и обнаружит, что она не существует.
Мы определили, что не получаем желаемое поведение автоматически, так что дальше? Так какmpl:: преобразованиеможет сделать что-то подобное, у нас должен быть способ сделать это тоже.
Статья THE BOOST MPL LIBRARY: Handling Placeholders раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: ::
реклама |