如何将迭代器用作模板参数并返回其值

How to use iterator as a template parameter and return its value?

本文关键字:参数 返回 迭代器      更新时间:2023-10-16

说我想写这样的函数:

template<typename Iterator, typename Iterator_value> 
Iterator_value foo(Iterator begin, Iterator end)
{
    vector<Iterator*> v(begin, end);
    do something
    return begin*;
}

这只是一个演示,我知道有很多错误。问题是:

  • 如何创建只有有关迭代器的信息的向量?

  • 如何用模板编写迭代器的返回值?

这是一个示例,我想编写一个通用的中位功能,我想返回确切的值,而不是返回迭代器。类似std::find

此外,我不想修改原始内容,因此我想创建一个矢量来复制迭代器值。如何仅使用迭代器创建向量?

我该如何实现?

您可以使用std::iterator_traits

template<typename Iterator>
typename std::iterator_traits<Iterator>::reference
foo(Iterator begin, Iterator end)
{
    vector<typename std::iterator_traits<Iterator>::value_type> v(begin, end);
    //do something
    return *begin;
}

autodecltype是一种替代方法:

template<typename Iterator>
decltype(auto) // C++14
foo(Iterator begin, Iterator end)
// or auto foo(..) -> decltype(*begin) in C++11
{
    std::vector<std::decay_t<decltype(*begin)>> v(begin, end);
    //do something
    return *begin;
}