2012-05-23 93 views
0

我有一個模板類template<typename T, typename R>。 R的類型爲vector<T*>list<T*>運算符重載和模板特化

我想讓我的類超載[]運算符,以便萬一它是一個向量,我將使用內置的[]運算符來提高效率,如果它是一個列表,我將使用迭代器實現它。

對我來說,它聽起來就像模板專業化工作,所以我認爲寫這樣的事情:

template<typename T, typename R> 
T& tContainer_t<T, R>::operator[](unsigned i) 
{ 
    //TODO with iterators 
} 

template<> 
T& tContainer_t::operator[]<T, std::vector<T*> >(unsigned i) 
{ 
    // TODO with built in [] operator 
} 

這是錯誤的,編譯器不會允許這樣。

有沒有辦法讓它工作,或者我應該使用typeid()來區分運行時的兩個對象,並據此採取行動?

回答

3

使用模板實現它的方法是在可以部分專用的類中創建一個靜態輔助函數。不過,我會做的是:

template<typename T, typename R> 
T& tContainer_t<T, R>::operator[](unsigned i) 
{ 
    //assuming that the container refernce is name container; 
    typename R::iterator itr = container.begin(); 
    std::advance(itr, i); 
    return *itr; 
} 

std::advance保證了與隨機訪問迭代器(如vector)的容器,它是固定的時間(基本上,它的迭代器+ N),它可以作爲指針查找矢量執行的速度很快。否則,它會執行iterator++ n次,這將是線性時間。 const版本將使用const_iterator,但實質上是相同的。

這樣做可以讓您正確處理不同類型的容器(不僅僅是向量和列表),而無需修改代碼。

+0

認爲我們可以就回答這個問題達成一致。 :-) –

+0

@BoPersson:我想我們可以:) –

2

您不必超載操作員。庫包含重載的函數來幫助你。 std::advance將移動迭代器,利用operator+()作爲隨機訪問迭代器。

template<typename T, typename R> 
T& tContainer_t<T, R>::operator[](unsigned i)  
{ 
    typename R::iterator it = myContainer.begin(); 
    std::advance(it, i); 

    return *it; 
}