我有一個表示數值數組的模板類。我希望這個類適用於任何類型的數值(如int,double等)和三種類型的容器(std :: vector,std :: deque和std :: list)。模板類中函數的部分特化
下面是執行中的相關內容對我的具體問題:
template < typename Numeric_t, typename Container = std::vector<Numeric_t> >
class Array {
// field member
Container m_data;
// other stuff here
// ...
// random element access for std::vector and std::deque
Numeric_t & operator[] (unsigned int index) { return m_data[index]; }
// random element access for std::list
Numeric_t & operator [] (unsigned int index) {
std::list<Numeric_t> :: iterator it = m_data.begin();
std::advance(it, index);
return *it;
}
}
當然,編譯器不允許我重載運營商[]。
我需要的是針對std :: list的運算符[]的一種部分特化,但在C++中不允許部分模板函數專門化。
(我知道隨機元素訪問對列表來說效率不高,但這不是重點)。
理想的情況下,在客戶端代碼中,我想用Array類是這樣的:
Array < int, std::vector<int> > vec;
Array < int, std::list<int> > lst;
// fill arrays here
// ...
std::cout << vec[0] << std::endl;
std::cout << lst[0] << std::endl;
大量的研究後,我沒能找到一個有效的解決方案。
什麼是最優雅的方式來解決這個問題?
感謝您的幫助。
我認爲你的意思是'覆蓋',而不是'超載'......但我認爲你需要整個'Array'類專業化的情況下,'容器'是一個'列表'的情況。 – sje397 2012-04-18 06:40:40
您是否嘗試爲整個班級寫作專業化?如果你的代碼不是特定於模板類型的,你可以編寫一個模板基類,並讓你的特定類繼承該基類。 – smichak 2012-04-18 06:44:52
我們對此已有一個常見問題解答 – 2012-04-18 08:51:17