如何理解STL源代码中该模板的用法



我目前正在查看SGI STL的源代码,特别是距离算法。

正如我所看到的,为了最大限度地提高效率,SGI使用了大量的内联模板来最小化运行时间。但我一点也不明白。

对于算法距离,SGI定义了一个模板:

template <class Iterator>
inline typename iterator_traits<Iterator>::iterator_category
iterator_category(const Iterator&){
typedef typename iterator_traits<Iterator>::iterator_category category;
return category();
}

然后,它像一样定义了算法距离的公共接口

template <class Iterator>
inline iterator_traits<Iterator>::iterator_category
distance(InputIterator first, InputIterator last)
{
typedef typename iterator_traits<InputIterator>::iterator_category category;
return __distance(first, last, category());
}

在你对我的知识做出所有判断之前,我想说的是,我理解STL的设计模式,我理解每一行的含义,我指的是语法。

但据我所知,我只是不知道SGI为什么没有像那样实现算法距离

template <class Iterator>
inline iterator_traits<Iterator>::iterator_category
distance(InputIterator first, InputIterator last)
{
return __distance(first, last, iterator_category<InputIterator>(first));
}

据我所知,函数调用会消耗一定的时间,但在这里,迭代器_类别是内联函数,它与大多数主流编译器中的宏具有相同的效果。

使用迭代器_category((的唯一不足可能是编译器由于传递常量引用而生成的临时对象。

我说得对吗?或者有什么天才的设计模式我还没有认识,可以让我知道!

在实现中使用iterator_category<InputIterator>(first)可能会被自定义迭代器的ADL劫持。

namespace HiJack
{
class MyIter{/*..*/};
template <class T> // would be not templated with call like iterator_category(first)
auto iterator_category(const MyIer&){ /*..*/ }
}

您可能认为__distance(first, last, category());中的__distance也是如此,但带有__的名称是保留的,普通用户不能使用。

但是完全限定的调用将解决这个问题(假设名称空间sgi(:

template <class Iterator>
inline iterator_traits<Iterator>::iterator_category
distance(InputIterator first, InputIterator last)
{
return __distance(first, last, ::sgi::iterator_category<InputIterator>(first));
}

相关内容

  • 没有找到相关文章

最新更新