现在我们有这样一坨代码:
std::vector<int> arr;
// ...
for(std::vector<int>::iterator iter = arr.begin(); iter != arr.end(); ++iter)
{
// ...
}
其中难看而又不好维护的std::vector::iterator,由于我们无法自动获知arr.begin()的类型,从而不得不一写再写。
C++11下有typeof和auto关键字,于是像上面第3行那样纠结的位置可以变得简单不少:
std::vector<int> arr;
// ...
for(auto iter = arr.begin(); iter != arr.end(); ++iter)
{
// ...
}
在vc下(2005、2008、2010)对这两个关键字都不支持;gcc(4.7以前)支持typeof,但是没有auto。
假如有typeof的话,auto可以很简单的模拟出来,那么问题的关键点在于如何实现typeof。
一、需要注册id的typeof
在C++里,可以在编译期计算表达式类型的只有下面两个东西:
1. sizeof
这东西很强大,不论后面的表达式是什么,均可以在编译期正确得到类型并直接返回类型大小。
2. typeid
若不使用C++的RTTI功能,typeid会在编译期计算出表达式的类型,并返回一个type_info引用。
使用第一种方法,我们可以得到一个数字,只要这个数字对类型而言是唯一的,那么我们就可以通过它反向得到类型。
类似这样写:
template <typename T>
struct Type2ID;
template <int id>
struct ID2Type;
template <typename T>
Type2ID<T> encode(const T&);
template <typename T>
Type2ID<T> encode(T&);
#define type_of(...) \
ID2Type<sizeof(enc