簡體   English   中英

使用std :: remove_reference來獲取STL容器的元素迭代器

[英]using std::remove_reference to get an element iterator of STL container

我正在嘗試使用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
}

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也不安全......但當然我不確定你打算如何使用它。

remove_reference的目的是remove_reference std::vector<T>::end()產生一個迭代器,而&c[0]產生一個指向元素的指針。

定義您期望my_end()返回的內容,然后我們可以幫助您解決問題。

如果你想要的只是返回一個迭代器,那么聲明它是這樣的:

auto my_end(T& c) -> decltype(begin(c)) { }

remove_reference回來,你想remove_reference ,對吧......?

謝謝你們的幫助。 代碼在下面的評論中看起來很蹩腳,所以這里又是。 這次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 It) -> typename remove_reference<decltype(It)>::type
{
    return It-1; 
}

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(end(ia));
    cout << *my_back1 << endl; //prints 10

    auto my_back2 = my_end(end(v));
    cout << *my_back2 << endl; //should print 10
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM