2013-06-28 94 views
4

這是一個簡單的問題,我想。如何編寫接受std :: vector或std :: list的函數?

向量和列表都具有push和pop功能,以及 - 更重要的是 - 可以遍歷:

for (auto value : items) 
    ... 

的std :: vector和std ::名單似乎並不共享一個基礎類,然而。所以問題是:我如何編寫一個函數來接受任何一個(或者其他符合實現的東西)?

std::list<int> a; 
std::vector<int> b; 
DoSomething(a); 
DoSomething(b); 

我想這樣做沒有超載。如果使用模板,它們不應該導致瘋狂的錯誤消息。例如,下面的代碼 -

int a; 
DoSomething(a); 

- 應導致編譯錯誤在調用點,不顯山露水的模板裏面!

任何人有什麼想法?

回答

1

C++標準化委員會試圖將概念引入C++ 0x(現在稱爲C++ 11)來解決您在此提出的問題。他們被迫在後期退出,所以我們必須等到未來版本的標準。

Boost的BCCL提供了一種便攜式臨時解決方案。我從來沒有使用過圖書館,所以我不能保證或反對它。

+0

因此在未來五年左右,這是不可能的? (BCCL看起來太複雜,順便說一句) –

0

大多數stl算法都使用迭代器作爲容器的抽象層。

例如,sort需要2個隨機訪問迭代器進行排序:

template <class RandomAccessIterator> 
    void sort (RandomAccessIterator first, RandomAccessIterator last); 

大部分的算法可以用這個成語

根據不同的算法計劃實現你需要選擇執行在4種標準迭代器之間

Here是解釋哪種類型更適合的鏈接

+0

所以我唯一的選擇是接受兩個'forward_iterator'實例?聽起來有點尷尬,對我來說。爲什麼所有的集合都不具有'Begin()'和'End()'函數的基類'Iterable'?嘆。 –

+0

大多數標準模板庫(STL)都是基於模板而不是繼承。你沒有'Iteratable'的原因之一是因爲繼承圖必須是複雜的以適應4種類型的迭代器。 – tiridactil

相關問題