萃取器相当于对迭代器的功能扩展,有了它让我们得以通过迭代器获得迭代器所指的数据的类型。
现在假设我们要实现一个算法,它接受一个迭代器作为参数,算法中需要定义一个变量,类型为迭代器所指的数据的类型。
对于这个问题,我们并没有什么好办法,C++没有typeof()这种东西,typeid()也只能获得关于类型的信息,并不能用来声明变量。
不过我们还是可以仰仗function templete的参数推导来完成这个任务。
template<class I,class T>
void func_impl(I iter,T t)
{
T tmp;
//do something
}
template<class I>
void func(I iter)
{
func_impl(iter,*iter);
}
int main ()
{
int i;
func(&i);
}
把func()当成一个接口,把实际要做的工作放在func_impl中去做,编译器自动帮我们推导出了T,解决了问题。
可是这种方法有很大的缺陷,首先它很麻烦,其次如果我要把T类型当成函数的返回值,无论怎样这种方法都是没法解决问题的,我们只能另寻出路。
新的方法是在迭代器的定义中做手脚。
template<class T>
struct MyIter
{
typedef T value_type;
T* ptr;
//...
};
template <class I>
typename I::value_type func(I ite)
{
return