gpt4 book ai didi

c++ - 使用 std::remove_reference 获取 STL 容器的元素迭代器

转载 作者:太空狗 更新时间:2023-10-29 23:41:10 28 4
gpt4 key购买 nike

我正在试验 std::remove_reference。例如,我可以将一个元素类型提取为一个数组,但如何让 remove_reference 与 STL 容器一起使用?例如,我想使用下面的 remove_reference 将迭代器返回到 vector 的元素:

#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
}

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

cannot convert from 'std::_Vector_iterator<_Myvec>' to 'int *'  

最佳答案

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

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

如果你想返回一个迭代器,使用decltype(end(c))或类似的东西。


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

ia.back();

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

ia.rbegin();

这也将取消对最后一个条目的引用。

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

关于c++ - 使用 std::remove_reference 获取 STL 容器的元素迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13124648/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com