使用std :: remove_reference来获取STL容器的元素迭代器

hhb*_*lly 2 c++ c++11

我正在尝试使用std :: remove_reference.例如,我可以提取元素类型数组但是如何使用remove_reference来处理STL容器?例如,我想使用下面的remove_reference将迭代器返回到向量的元素:

#include <iostream>
#include <vector>
#include <type_traits>
using std::vector;
using std::cout;
using std::endl;
using std::begin;
using std::end;
using std::remove_reference;

template<typename T> 
auto my_end(T& c) -> typename remove_reference<decltype(&c[0])>::type
{
    return end(c)-1; //compile error when myend<vector> is instantiated
}

int main()
{
    int ia[] = {1,2,3,4,5,6,7,8,10};
    vector<int> v(begin(ia), end(ia));

    auto my_back1 = *my_end(ia);
    cout << my_back1 << endl; //prints 10

    auto my_back2 = *my_end(v);
    cout << my_back2 << endl; //should print 10
}
Run Code Online (Sandbox Code Playgroud)

my_end<vector>实例化时的编译器错误是:

cannot convert from 'std::_Vector_iterator<_Myvec>' to 'int *'  
Run Code Online (Sandbox Code Playgroud)

Use*_*ess 6

返回的类型是std::vector<T>::operator[]什么?这是一个T&.所以,结果decltype(&c[0])T*.

但是什么类型的end(c)-1?它是一个迭代器.

如果要返回迭代器,请使用decltype(end(c))或类似的东西.


请注意,如果您只想引用最后一个元素,则可以使用(或换行):

ia.back();
Run Code Online (Sandbox Code Playgroud)

如果你想要一个迭代器(由于某种原因),但不关心方向:

ia.rbegin();
Run Code Online (Sandbox Code Playgroud)

这也将取消引用最后一个条目.

my_end如果容器是空的,你也不安全......但当然我不确定你打算如何使用它.