1、特点
1)模板元编程产生的元程序---在编译期执行的程序
2)操作的对象---不是普通变量,因而不是使用运行时的C++关键字如(if,else ,for)
3)常用的是编译期的整数常量:enum,static
2、模板元编程与普通编程的区别
模板元编程与普通运行时编程的不同点:
1)普通程序时运行时处理数据;
2)元数据不同普通的运行时变量,是抽象数据类型,编译期可操作;
例如元数据:meta1,meta2
typedef int meta1;
typedef std::vector<float>meta2;
3) 元函数:实际表现为C++的一个类或模板类.
元函数返回值:因为元编程不能使用运行时关键字,所以不能return 返回计算结果,需要在元函数内部用typedef 定义一个名为type的类型或value的值作为返回值。
可以用typedef 返回任意多个返回值(>=0个,同普通函数)
元函数参数---模板参数列表的模板参数
实参---------元函数被调用时的真正类型
3、元编程实例
1)编译期计算2个整数的和
template<int N,int M>
struct add1
{
BOOST_STATIC_CONSTANT(int,value=N+M);//编译期计算
};
cout<<add1<10,10>::value<<endl;
int i=2,j=3;
cout<<meta_func1<i,j>::value<<endl;错误,i,j,是运行时变量2)编译期求两数的最小值
template<int N,int M>
struct min
{
static const int value=(N<M)?N:M;//编译期计算
};
cout<< min<9,10>::value<<endl;--------------------------------------------------------------------------------------------------------------------------
模板元编程库:type_traits
类型特征提取----模板元编程的基础type_traits提供元函数,编译期确定类型(元数据)是否具有某些特征,例如
是否是原生数组,是否是整数
以is_,has_开头,
is_integral<T>
is_float<T>
is_void<T>
is_array<T>
is_class<T>
is_enum<T>
is_union<T>
is_complex<T>
is_pointer<T>
is_lvalue_reference<T>
is_function<T>
is_member_object_pointer<T>成员变量指针
STL中相关的traits技法见博文链接:http://blog.csdn.net/huazhongkejidaxuezpp/article/details/19416057