1.1 元数据(Metadata): 可以被C++编译器在编译期操纵的"值",主要有两种:类型和常量(int, bool, global ptr, etc)。由于元数据是不可变的(immutable),元编程(Metaprogramming)中的迭代一般是通过递归来完成的。如:
template
{
static const int value = base * Power
};
template
static const int value = 1;
};
int _3power5 = Power<3, 5>::value;
1.2 元函数(Metafunction):一个可以在编译期"调用"的"函数",输入参数是metadata(也可以没有任何输入参数),输出参数是一个名为"type"的类型。对于数值型metafunction,还有输出一个名为"value"的常量。
元函数与传统的traits很相似,但在概念上有很大区别。traits是把很多特性集合在一起,运用程序在这个集合中各取所需。元函数则完全模仿了"函数(function)"这个概念,具有很强的可扩展性。
template
struct Selector
{
typedef L type;
};
template
struct Selector
{
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
};
No comments:
Post a Comment