2012-11-19 89 views
1

是否有可能在C++11中創建一個函數,該函數將接受任何iterator作爲特定stl容器(如vectorlist)中的輸入參數?C++ 11迭代器接口

我想寫類似

void f(iterator<int> i){ 
    for (auto el : i) 
     cout << el; 
} 
int main(){ 
    vector<int> v; 
    list<int> l; 
    ... 
    f(v); 
    f(l); 
} 

這可能嗎?

+6

使其成爲模板? –

+0

當然......謝謝 - 我已經忘記了,當你創建函數模板時,你可以使用它而不需要提供模板類型的明確信息。 –

+0

你在尋找'RangeS'嗎?一個迭代器不是很有用。 – pmr

回答

2

不可以。您可以編寫一個接受任何迭代器作爲參數但不包含函數的函數模板。

如果您有一個類爲迭代器輸入了擦除類型,那麼您可以將其作爲參數。這裏是an article and code for iterator type erasure

1

某處有一個boost :: any_iterator。但該標準沒有提供。

3

如果您希望函數接受迭代器,則不能使用for (auto i: cont)語法。事實上,這種基於範圍的新語法需要容器,而不是迭代器。

然後,你可以很容易地讓你的函數成爲一個函數模板,傳遞容器。

template <class CONT> 
void f(CONT &cont){ 
    for (auto el : cont) 
     cout << el; 
} 

如果你想繼續傳遞迭代器,那麼你也必須去模板的方式,但你必須傳遞兩個迭代器作爲參數。第一個,最後一個(就像algorithm一樣)。

template <class IT> 
void f(IT first, IT last) { 
    for (; first!=last ; ++first) 
     cout << first; 
}