我正在尝试使用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)
返回的类型是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如果容器是空的,你也不安全......但当然我不确定你打算如何使用它.
| 归档时间: |
|
| 查看次数: |
310 次 |
| 最近记录: |