如何在C++中从迭代器中检索值类型?

Ily*_*gin 30 c++ iterator

对于熟悉C++语法的人来说,我的问题肯定是一个简单的问题.我只是在学习c ++,这是一种功课.

template<typename Iter>
void quickSort(Iter begin, Iter end)
{        
    //..
    auto pivot = * ( begin + (end - begin)/2 );
    //..
}
Run Code Online (Sandbox Code Playgroud)

pivot应该包含来自[begin,end]间隔中心的值.Ite我写的代码有效,但它auto是一个新的语言标准的关键字.怎么做老路?写什么而不是auto

Ste*_*sop 33

typename std::iterator_traits<Iter>::value_type

如果您的模板Iter使用指针类型进行实例化,这将起作用.

顺便说一句,typename不是类型本身的一部分.它告诉编译器value_type确实是一个类型.如果它是函数或静态数据成员的名称,则会影响语法.编译器不一定知道它是什么,因为在编译模板时,iterator_traitsfor的特化Iter可能不可见.

  • @Tony:那是真的,因为这个原因,`auto`更好.但是,所有标准算法都要求用户传递具有"iterator_traits"(24.3.1)的内容,并且用户定义的函数模板具有相同的限制是合理的.编写迭代器的人可以使用`std :: iterator`作为基类来弥合*尝试*传入迭代器之间的差距,并实际传入`Iterator` ;-) (5认同)
  • @Les:您可以使用typeid,并且应用于*Iter(而不是Iter)的typeid可以告诉您值类型的文本名称,但是您无法根据typeid创建该类型的对象...没有链接到typeid信息中的工厂方法/构造函数. (3认同)

小智 6

从 c++ 11 开始这也可以工作:

typename Iter::value_type
Run Code Online (Sandbox Code Playgroud)

所以您不必输入整个std::iterator_traits内容。