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