Item 48: Be aware of template metaprogramming.
模板元编程(Template Metaprogramming,TMP)就是利用模板来编写那些在编译时运行的C++程序。 模板元程序(Template Metaprogram)是由C++写成的,运行在编译器中的程序。当程序运行结束后,它的输出仍然会正常地编译。
C++并不是为模板元编程设计的,但自90年代以来,模板元编程的用处逐渐地被世人所发现。
在Item 47中提到了这样一个std::advance
的实现:
template<typename IterT, typename DistT>
void advance(IterT& iter, DistT d) {
if (typeid(typename std::iterator_traits<IterT>::iterator_category) ==
typeid(std::random_access_iterator_tag)){
iter += d;
}
...
}
list<int>::iterator it;
advance(it, 10);
其实上述代码是不能编译的,设想以下advance<list<int>::iterator, int>
中的这条语句:
iter += d;
list<int>::iterator
是双向迭代器,不支持+=
运算。虽然上述语句不会执行,但编译器不知道这一点。 编译时这条语句仍然会抛出类型错误。
TMP后来被证明是图灵完全的,这意味着TMP可以用来计算任何可计算的问题。你可以声明变量、执行循环、编写和调用函数等等。 但它的使用风格和普通C++完全不同。
我们来看看TMP中如何执行一个循环:
template<unsigned n>
struct Factorial{
enum{ value = n * Factorial<n-1>::value };
};
template<>
struct Factorial<0>{
enum{ value = 1 };
};
int main(){
cout<<Factorial<5>::value;
}
这是一个典型的TMP例子,其低位就像是普通编程语言中的”hello world”一样。
为了更好地理解TMP的重要性,我们来看看TMP能干什么:
本文地址:http://harttle.com/2015/09/16/effective-cpp-48.html