Friday, August 20, 2010

boost::MPL - Conceptions

1. MPL 的几个重要概念。

    1.1 元数据(Metadata): 可以被C++编译器在编译期操纵的"值",主要有两种:类型和常量(int, bool, global ptr, etc)。由于元数据是不可变的(immutable),元编程(Metaprogramming)中的迭代一般是通过递归来完成的。如:

        template <int base, int power>
        struct Power
        {
            static const int value = base * Power::value;
        };
       
        template
<int base>
        struct Power<base, 0>
        {
            static const int value = 1;
        };
       
        int _3power5 = Power<3, 5>::value;



    1.2 元函数(Metafunction):一个可以在编译期"调用"的"函数",输入参数是metadata(也可以没有任何输入参数),输出参数是一个名为"type"的类型。对于数值型metafunction,还有输出一个名为"value"的常量。

    元函数与传统的traits很相似,但在概念上有很大区别。traits是把很多特性集合在一起,运用程序在这个集合中各取所需。元函数则完全模仿了"函数(function)"这个概念,具有很强的可扩展性。

        template <bool condition, class L, class R>
        struct Selector
        {
            typedef L type;
        };
       
        template <class L, class R>
        struct Selector<false, L, R >
        {
            typedef R type;
        };


        Selector<true, int, float>::type _int = 10;      // int
        Selector<false, int, float>::type _float = 1.23; // float


    1.3 元函数类(Metafunction class)(??有更好的不容易与元函数混淆的翻译??): 一个实现了元函数"apply"的类。概念上类似于c++中的仿函数(functor).

        struct SelectorWrapper
        {
            template<bool condition, class L, class R>
            struct apply
            {
                typedef typename Selector<condition, L, R>::type type;
            };
        };

        SelectorWrapper::apply<true, int, float>::type _int1 = 20; // still int


    1.4 多态(Polymorphism):同一接口具有操作不同类型的能力。MPL通过返回"type"和"value"的约定,确保代码的可复用性和组件之间互操作的自然性。


    1.5 高阶元函数(high-order metafunction):一种元函数,接受并且在运算中使用其它元函数参数。概念上类似于接受函数指针的函数,或接受functor的函数。典型的高阶元函数是 boost::mpl::transform

        template<class F, class X>
        struct high_order_fun
        {
            typedef typename F::template apply::type type;
        };

No comments: