简述STL之萃取器

萃取器相当于对迭代器的功能扩展,有了它让我们得以通过迭代器获得迭代器所指的数据的类型。现在假设我们要实现一个算法,它接受一个迭代器作为参数,算法中需要定义一个变量,类型为迭代器所指的数据的类型。对于这个问题,我们并没有什么好办法,C++没有typeof()这种东西,typeid()也只能获得关于类型的信息,并不能用来声明变量。不过我们还是可以仰仗function templete的参数...
摘要由CSDN通过智能技术生成

萃取器相当于对迭代器的功能扩展,有了它让我们得以通过迭代器获得迭代器所指的数据的类型。

现在假设我们要实现一个算法,它接受一个迭代器作为参数,算法中需要定义一个变量,类型为迭代器所指的数据的类型。

对于这个问题,我们并没有什么好办法,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 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值