2017-04-10 37 views
0

這有點類似於我的以前question,我想實現一個模板地圖類。模板化地圖/字典實現

template<typename T, size_t M> class Array { ... } // Fixed-size container 
template<typename T> class Vector { ... } // Variable-size container 

方法1:

template<typename KeyContainer, typename ValueContainer> class Map 
{ 
    KeyContainer keys; 
    ValueContainer values; 
} 

這裏的問題是我不能保證兩個容器將是相同的,用戶可以通過一個Array<T, M>作爲密鑰容器和Vector<T>作爲值容器導致的問題,一旦地圖開始超過在Array<T, M>模板中指定的大小。

方法2:

template<typename KeyType, typename ValueType, template<typename> class Container> class Map 
{ 
    Container<KeyType> keys; 
    Container<ValueType> values; 
    // What if Container is an Array<T, M>? 
} 

而是表現在我以前的那個我聯繫似乎是不可能這樣做的問題:接收已經變參數計數的容器模板,除非有一些巧妙的模板我不知道的技巧。

方法3:

實現方法1,只是把一張紙條,告知用戶KeyContainerValueContainer必須是同一類型的容器的文檔。

問題: 什麼是最理想的方式去解決這個問題?

+1

爲什麼你要爲'Map'指定一個容器?如果你想複製'std :: map'的功能,你需要實現一個RB-Tree。 – NathanOliver

+0

你的意思是最佳?有什麼限制?目標是什麼? – m8mble

+0

@NathanOliver忘了提及我正在做這個練習,這就是爲什麼我沒有提到STL容器的原因。至於爲Map指定容器的問題,我希望這個類足夠靈活,能夠接受任何類型的容器實現。 –

回答

1

方法2是一個很好的解決方案,爲您的用戶總是可以 「綁定」 模板參數使用模板別名

template <typename T> 
using ArrayOf5 = Array<T, 5>; 

int main() 
{ 
    Map<int, float, ArrayOf5> m; 
} 

live wandbox example


你可以讓Container採取更多模板參數通過使用可變參數包

template <typename...> class Container 

但那就不是非類型模板參數工作作爲Array的情況。

+0

這是相當整潔,我從來沒有想過使用'使用'那種方式。 +1 –

1

您可以將數據存儲爲:

template <class Key, class Value, template<typename> class Container> 
class Map 
{ 
    Container<std::pair<Key, Value> > store; 
}; 

免責聲明:我個人不認爲這使多大意義。我沒有看到改變的Map用過的Container的使用情況。您的Map的任何用戶都很難看到Container的所有要求(例如,Container需要哪些方法?可能會拋出哪些方法?const?)在任何合理的情況下,用戶將使用您的一些默認值Container 。在任何情況下,額外的模板參數不會看到太多使用這就是爲什麼我會堅持到特定Container型。

+0

我只是想了解模板作爲練習能走多遠,但在閱讀完答案後,似乎'Container'模板參數似乎不再需要。 +1 –