понедельник, 3 марта 2008 г.

boost::mpl - первые впечатления

Недавно состоялось мое знакомство с библиотекой boost::mpl, надо сказать что просто с ходу начать ее использовать как например boost::any или boost::shared_ptr довольно проблематично. Знакомиться нужно по книге "C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond" таких известных людей как David Abrahams, Aleksey Gurtovoy. Я пока-что осилил первые 3 главы, но мне уже есть что сказать))) Начинается все с того, что - "In C++, it was discovered almost by accident"(имеется ввиду возможность мета-программирования). Вот оно оказывается как, а я думал шаблоны специально для этого создавались , а на самом деле все банально :-D. Далее постепенно раскрываются основы организации библиотеки, любая мета-функция имеет вид: metafunction-name::type, с точки зрения языка metafunction-name - это имя класса, а type - это объявление типа. С точки зрения библиотеки metafunction-name, это имя мета-функции, которая отображает множество своих аргументов (параметров шаблона), в множество возвращаемых значений (type). Числовые значения то-же являются типами, если какая-либо мета-функция возвращает константу, то делает она это через wrapper(что-то вроде IntToType в Loki) вот так: metafunction-name::type::value. Для того что-бы передать в мета-функцию другую мета-функцию (higer-order metafunctions), используется интересный прием, вместо использования шаблон шаблонных параметров(дикое название :)) используется простая идиома. В место привычного:
template<typename arg, template<typename T> class Pred>
struct higer_order_fn
{
    typedef typename Pred<arg>::type type;
};

там пишут так:

struct foo
{
    template <typename arg>
    struct apply
    {
        typedef ... type;
    };
};

template<typename arg, typename Pred>
struct higer_order_fn
{
    typedef typename Pred::apply<arg>::type type;
};
что поваляет писать мета-функции возвращающие другие мета-функции, вот такой вот approach)) Если подитожить, то мета-класс это простой класс(не шаблонный), содержащий вложенный шаблонный класс(мета-функцию), который называется apply. Единственное что мне не нравится, это placeholders. В двух словах, это штука которая позволяет писать вот так: mpl::transform< D1,D2,mpl::minus<_1,_2> >::type, вместо того, что-бы описывать мета-класс, так как показано выше. Не нравится мне в них даже не то, что как они реализованы я и представить не могу, а то-что код не выглядит как корректный код на С++. Для code review это не очень подходит, но к счастью у нас такое не практикуется))) P.S. Посмотрел на выходных фильм - "Ванильные небеса". Как могло такое случиться, что я его не видел раньше, фильм просто супер, производит очень сильное впечатление.

Комментариев нет: